我正在尝试使用 CButton 构建一个所有者绘制的复选框,但由于我只想更改文本颜色,我希望复选框标记保持不变。
是否有一个命令允许我检索运行程序的平台的默认复选框位图?
(或者:我怎么能只更改文本颜色,保留复选框标记?)
我使用 UxTheme.dll 来绘制我的自定义复选框。
首先,我使用以下方法绘制复选框标记:DrawThemeBackground传递一个修改后的矩形 (checkboxRect.right = pCustomDraw->rc.left + 15;)
然后我使用 ::DrawText 自己绘制文本。
我希望它有所帮助。
您最好的策略是覆盖 OnCtlColor 处理程序:
BEGIN_MESSAGE_MAP(CBaseDialog, CDialog)
{
ON_WM_CTLCOLOR()
}
HBRUSH CXXX:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hBkgrBrush= CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetTextColor(RGB(255,0,0)); // red
pDC->SetBkMode (TRANSPARENT );
return hBkgrBrush;
}
请参阅http://msdn.microsoft.com/en-us/library/0wwk06hc(VS.80).aspx|
如果您只想更改文本颜色,OnCtlColor
请在包含对话框中实现处理程序。像这样:
HBRUSH CDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() == IDC_CHECK_BOX) //check for your check box control ID
{
pDC->SetTextColor(RGB(255,0,0));
}
return hbr;
}
请注意,这不适用于常规按钮,但对于复选框应该没有问题。无需实现所有者绘制的控件。
编辑:
您必须确保您的复选框使用该BS_AUTOCHECKBOX
样式。还要确保BS_OWNERDRAW
未设置样式。
编辑#2:带有 DFCS_BUTTONCHECK 的 DrawFrameControl()将让您绘制默认复选框位图。
要获取 Windows 系统复选框图像(我认为这是被问到的):
LoadBitmap(0,OBM_CHECKBOXES);
将位图句柄返回到所有复选框的 4x3 位图(包括单选按钮,以及启用和禁用)