OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)函数的三个参数分别是指啥?这个函数啥时候会被执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)函数的三个参数分别是指啥?这个函数啥时候会被执行相关的知识,希望对你有一定的参考价值。

在窗口创建或者重绘的时候会被调用。
pDC是一个CDC指针,是用来绘图和显示的
pWnd是一个cWnd指针,指向控件(不确定)
nCtlColor则是用来区别不同的调用的
msdn中的解释页面为http://msdn.microsoft.com/en-us/library/0wwk06hc(VS.80).aspx
这个函数一般用来创建有个性的页面,这里有个教程,看看或许会对这个函数的理解更深:http://www.sudu.cn/info/html/edu/net/20060706/324613_2.html
参考技术A CDC* pDC:一个指针对象,指向绘图区域(设备环境)
CWnd* pWnd:一个指针对象,指向窗口的名柄
UINT nCtlColor: 控件的类型编号 如下可选:
CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static control
当子窗口被提取时,该框架要求执行这个成员函数
:在这里可以改变控件的背景色、前景色、字体等。

参考资料:http://zhidao.baidu.com/question/76676639

参考技术B OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );   返回值:OnCtlColor必须返回一个刷子句柄,该刷子将被用于画出控件的背景。   参数: pDC 包含了子窗口的显示设备环境的指针。可能是临时的。 PWnd 包含了要求颜色的控件的指针。可能是临时的。 NCtlColor 包含了下列值,指定了控件的类型: · CTLCOLOR_BTN 按钮控件 · CTLCOLOR_DLG 对话框 · CTLCOLOR_EDIT 编辑控件 · CTLCOLOR_LISTBOX 列表框控件 · CTLCOLOR_MSGBOX 消息框 · CTLCOLOR_SCROLLBAR 滚动条控件 · CTLCOLOR_STATIC 静态控件

更改 CComboBox 的文本和背景

【中文标题】更改 CComboBox 的文本和背景【英文标题】:Change text and background of CComboBox 【发布时间】:2014-11-24 07:54:31 【问题描述】:

我想给CComboBox的编辑框上色。但我也想为 CBS_DROPDOWN 样式和 CBS_DROPDOWNLIST 这样做。 我覆盖了

HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 

HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

if(CTLCOLOR_EDIT == nCtlColor)

    pDC->SetTextColor(m_crAlertText);
    pDC->SetBkColor(m_crAlertBkg);
    hbr = m_hBrushAlert;
    pDC->SetBkMode(TRANSPARENT);


// TODO: Return a different brush if the default is not desired

return hbr;

但是如果 CComboBox 具有 CBS_DROPDOWNLIST 样式,这不起作用...为什么?

后期编辑:

是的,我已经尝试过了:

HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 

HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

    //  if(CTLCOLOR_STATIC == nCtlColor)
    if(CTLCOLOR_EDIT == nCtlColor || CTLCOLOR_STATIC == nCtlColor)

    pDC->SetTextColor(m_crAlertText);
    pDC->SetBkColor(m_crAlertBkg);
    hbr = m_hBrushAlert;
    pDC->SetBkMode(TRANSPARENT);


// TODO: Return a different brush if the default is not desired

return hbr;

似乎不工作......我不明白为什么......

【问题讨论】:

【参考方案1】:

引用MSDN:

CBS_DROPDOWNLIST 与 CBS_DROPDOWN 类似,只是编辑控件被替换为显示当前的静态文本项 在列表框中选择。

所以,你不能改变编辑控件颜色的原因是,当你使用这种样式时,没有编辑控件。因此条件if(CTLCOLOR_EDIT == nCtlColor) 永远不会为真。您可能希望尝试测试CTLCOLOR_STATIC

【讨论】:

以上是关于OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)函数的三个参数分别是指啥?这个函数啥时候会被执行的主要内容,如果未能解决你的问题,请参考以下文章

MFC设置静态文本框背景为透明

如何在 setFocus 上绘制 CComboBox

MFC文本框字体颜色设置

CFromView视图中的Static text控件透明

VC的GroupBox控件

MFC对话框添加位图背景后编辑框输入文字会重影