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)函数的三个参数分别是指啥?这个函数啥时候会被执行的主要内容,如果未能解决你的问题,请参考以下文章