不定状態に異なるビットマップを使用するには3状態チェックボックスをどのようにして取得しますか?MFC VC++カスタムチェックボックス画像
3状態チェックボックスで使用するイメージを別のものに変更したい場合は、コントロールはWin98スタイルであり、そのチェックボックスの不確定状態は無効なチェックボックスと区別するのが難しい(これはおそらくWinXPスタイルのコントロールでこれを変更した理由ですが、プロジェクトの他の詳細のために使用できません) 。
私はVisual C++ 2010を使用していますが、VSのリソースエディタで8x8ビットマップを定義しました。ビットマップのIDはIDB_INDET_CHECK
です。
私はこのような何かのための標準的な "テクニック"が何であるか完全にはわかりません。私は実際には、WindowsのコントロールとMFCを操作するようになったばかりです。
最初に、CButton
から派生したCTriButton
というクラスを作成し、DrawItem
関数をオーバーライドして、自分で描画しようとしました。私はSubclassDlgItem
を使って、私のウィンドウ内のチェックボックスの1つをこのクラスに変えました(私は思っていますか?)。これは...作品の一種ですか?チェックボックスは表示されなくなり、空のチェックボックスフレームが表示されますが、何も表示されません(コード内のデバッグメッセージは送信されません)。
ここに関連コードがありますが、わかりませんがこれのは正しいです。まず、私のウィンドウのコードOnInitDialog
からのコード。
BOOL CAffixFilterDlg::OnInitDialog() // CAffixFilterDlg is my CDialog-derived window
{
CDialog::OnInitDialog(); // call basic version
// subclass a CButton-derived control with CTriButton
if (CBipedHead.SubclassDlgItem(IDC_HEAD, this)) // CBipedHead is a CTriButton member of CAffixFilterDlg, IDC_HEAD is a checkbox
SetWindowLong(CBipedHead.m_hWnd, GWL_STYLE, CBipedHead.GetStyle() | BS_OWNERDRAW); // set the ownerdraw style
else // subclassing didn't work
_ERROR("Subclassing failed."); // I do not see this error message, so SubclassDlgItem worked?
// initialization continues, but is not relevant...
UpdateWindow();
Invalidate();
return TRUE;
}
次に、カスタムボタンのDrawItem
のコードです。 OnInitDialogで
void CTriButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
_DMESSAGE("Drawing TriButton"); // never see this message
CDC dc;
dc.Attach(lpDrawItemStruct->hDC); //Get device context object
int nWidth = GetSystemMetrics(SM_CXMENUCHECK);
int nMargin = (nWidth - 8)/2;
CRect textRt = lpDrawItemStruct->rcItem;
textRt.right = textRt.right - nWidth - nMargin;
CString text;
GetWindowText(text);
UINT textDrawState = DST_TEXT;
if (lpDrawItemStruct->itemState & ODS_DISABLED)
textDrawState |= DSS_DISABLED;
dc.DrawState(CPoint(textRt.left, textRt.top), textRt.Size(), text, textDrawState, TRUE, 0, (CBrush*)NULL);
CRect rt = lpDrawItemStruct->rcItem; // initial rect is for entire button
rt.left = rt.right - nWidth; // set left margin
LONG center = (rt.bottom + rt.top)/2;
rt.top = center - nWidth/2;
rt.bottom = center + nWidth/2;
UINT checkDrawState = DFCS_BUTTONCHECK;
if (lpDrawItemStruct->itemState & ODS_DISABLED)
checkDrawState |= DFCS_INACTIVE;
if (lpDrawItemStruct->itemState & ODS_CHECKED)
checkDrawState |= DFCS_CHECKED;
else if (GetCheck() == BST_INDETERMINATE) {
_VMESSAGE("Indeterminate; custom draw.");
CBitmap indet_check = CBitmap();
indet_check.LoadBitmap(IDB_INDET_CHECK);
CPoint pt = CPoint(rt.left + nMargin, rt.top + nMargin);
CSize sz = CSize(8, 8);
dc.DrawState(pt, sz, &indet_check, DST_BITMAP|DSS_NORMAL);
}
dc.DrawFrameControl(rt, DFC_BUTTON, checkDrawState);
}
オーナー描画ウィンドウのスタイルはどこで有効にしましたか? – paludarium
あなたの質問は何ですか?トライスタイルを設定するか、ボタンの状態を中間に設定するには、チェックボックスをどこに設定しましたか? – Ajay
@paludarium:ありがとうございました。私はそれをすることを知らなかった。私は自分のコードを更新し、ownerdrawスタイルを設定しました。私はそれがすべき場所をクリックするまで、物事は全く描かれていないように見えます。そして、私は空のチェックボックスフレームだけを取得します。私の描画コードは呼び出されないようです(デバッグメッセージは表示されません)。私の質問はこれで更新されました。スタイルを設定していただきありがとうございます! – KRyan