1

我正在尝试使用 CButton 构建一个所有者绘制的复选框,但由于我只想更改文本颜色,我希望复选框标记保持不变。

是否有一个命令允许我检索运行程序的平台的默认复选框位图?

(或者:我怎么能只更改文本颜色,保留复选框标记?)

4

4 回答 4

4

我使用 UxTheme.dll 来绘制我的自定义复选框。

首先,我使用以下方法绘制复选框标记:DrawThemeBackground传递一个修改后的矩形 (checkboxRect.right = pCustomDraw->rc.left + 15;)

然后我使用 ::DrawText 自己绘制文本。

我希望它有所帮助。

于 2009-09-28T13:39:35.693 回答
1

您最好的策略是覆盖 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|

于 2009-09-28T12:30:36.667 回答
1

如果您只想更改文本颜色,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()将让您绘制默认复选框位图。

于 2009-09-28T12:40:19.913 回答
0

要获取 Windows 系统复选框图像(我认为这是被问到的):

LoadBitmap(0,OBM_CHECKBOXES);

将位图句柄返回到所有复选框的 4x3 位图(包括单选按钮,以及启用和禁用)

于 2018-05-07T00:56:41.293 回答