📄 10.6.2 仅改变某个子控件的背景及文本颜色.txt
字号:
10.6.2 仅改变某个子控件的背景及文本颜色
如果想要精确控制对话框上某个控件 (例如本例中的线型组框)的背景的绘制,就需要判断当前绘制
的是哪一个控件。通过上面的介绍,我们知道通过OnCtlColor函数的第二个参数: pWnd能够知道当
前绘制的控件窗口对象,这时可以通过调用CWnd类的 GetDlgCtrlID成员函数得到该控件的ID,然后
判断该E是否就是需要控制其背景绘制的控件ID,如果是就处理。 GetDlgCtrlID函数的声明形式如
下所示:
int GetDlgCtrlID( ) const; .
该函数不仅能返回对话框子控件的 ID,还能返回子窗口的囚。但是因为顶层窗口不具有 ID值,所
以如果调用该函数的CWnd对象是一个顶层窗口,该函数返回的值就是一个无效值。
这里,在 CSettingDlg类的 OnCtlColor函数中就可以利用传递进来的 pWnd来调用 GetDlgCtrlID
函数,然后判断一下如果其返回值等于线型组框的ID (IDCL剧E STYLE) , 那么就可以知道当前绘制
是的线型组框,那就需要改变该控件的背景色,即返回自定义的画刷,对其他控件仍使用先前的画
刷。因此,这时的OnCtlColor函数的代码如例 10-27所示。
例IJ 10-27
HBRUSH CSettingDlg : :OnCtlColor(CDC* pDC , CWnd食 pWnd, UINT口CtlColor)
HBRUSH hbr = CDialog : :OnCtlColor(pDC , pWnd , nCtlColor ) ;
// TODO: Change any attr
Ibutes of the DC here
/ / TODO : Return a different brush if the default i s not desired
if (pWnd->GetDlgCtrlID() ==IDC_LINE_STYLE)
return m_brush;
return hbr;
、 同样地,相信读者一定注意到了, OnCtlColor函数要求返回HBRUSH类型的画刷句柄,但上述代码中
返回了-个CBrush类型的画刷对象。这是因为CBrush类重载了HBRUSH操作符。
Build井运行Graphic程序,打开设置对话框,可以发现线型组框的背景色变成了蓝色。如图 10.24
所示。
为了改变线型组框控件上的文本颜色,应在
OnCtlColor消息响应函数对当前给制的控件进行判断,
如果判断出当前绘制的控件就是线型组框控件,在返回自定义的画刷之前,就调用 SetTextColor
函数将该控件~ . 上的文本设置为希望的颜色。本例将线型组框控件上的 文本设置为红色,代码如
例 10-28所示。图 10.24仅改变线型组框的背景色
例 10-28
HBRUSH CSett工ngDlg : :OnCtlColor(CDC* pDC , CWnd* pWnd , UINT nCtlColor)
HBRUSH hbr = CDialog: :OnCtlColor(pDC , pWnd , nCtlColor) ; 11 TODO : Change any attributes
of the DC here 11 TODO : Return a different brush if the default is not desired
if (pWnd->GetDlgCtrlID() ==IDC_LINE_STYLE) {
pDC->SetTextColor(RGB(255 , O, O));
return m_brush;
return hbr;
再次运行Graphic程序,将会看到这时线型组框控件的背景是蓝色,文字是红色的。如图 10.25所示。
图 10.25同时改变线型组框的背景色和文本颜色
因为控件上的文本本身也有背景色,所以图中线型组框的显示效果看上去不是很舒服,这时可以将
该控件上的文字的背景设置为透明的,即在上述如例 10-28所示代码中 SetTextColor函数调用之后
再添加下面这行语句:
pDC->SetBkMode(TRANSPARENT);
再次运行Graphic程序,将会看到线型组框上文字的背景色就没有了,如图 10.26所示。
图 10.26设置透明模式后的组框文字显示效果
下面,我们再实现编辑框控件背景的改变。实现原理同上,这时在OnCtlColor函数中如果判断当前
绘制的是编辑框控件,就设置文本颜色,并返回自定义的画刷。因此可以参照上面修改线型组框控
件的代码来实现编辑框控件背景色和文本颜色的改变,结果代码如例 10-29所示。
19IJ 10-29
HBRUSH CSettingDlg : :OnCtlColor(CDC* pDC , CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialog: :OnCtlColor(pDC , pWnd , nCtlColor);
11 TODO : Change any attributes of the DC here
11 TODO : Return a different brush工 f the default is not desired
if (pWnd->GetDlgCtrlID() ==IDC_LINE_STYLE)
pDC->SetTextColor(RGB(255 , O, O)) ;
pDC->SetBkMode(TRANSPARENT);
return m_brush;
if(pWnd->GetDlgCtrl工D () ==工DC_LINE_WIDTH)
{
pDC->SetTextColor(RGB(255 , O, O)) ;
pDC->SetBkMode(TRANSPARENT) ;
return m_brush;
return hbr ;
Build并运行Graphic程序,我们注意到编辑框的背景色是蓝色,文字变成红色的,但它仍然有一个
白色的背景。这是为什么呢?这是因为如果要改变单行编辑框控件的背景颜色,除了需要设置背景画
刷句柄之外,还要调用SetBkColor函数设置其背景色。因此这里设置编辑框控件的背景为透明的这
一操作就没有意义了,这里需要的是设置其背景色,本例也将其设置为蓝色,代码如例 10-30所示。
HBRUSH CSett工ngDlg : : OnCtlColor(CDC* pDC , CWnd* pWnd, U工NT nCtlColor)
HBRUSH hbr = CDialog : : OnCtlColor(pDC , pWnd , nCtlColor); // TODO : Change any attributes
of the DC here // TODO : Return a different brush if the default is not desired
if(pWnd->GetDlgCtrlID()==工DC_LINE_STYLE)
pDC一>SetTextColor(RGB(255,O,O));
pDC->SetBkMode(TRANSPARENT) ;
return m_brush;
if (pWnd->GetDlgCtrlID() ==工DC_L工NE_W工DTH)
pDC->SetTextColor(RGB(255 , O, O));
//pDC->SetBkMode(TRANSPARENT) ;
pDC->SetBkColor(RGB(O , O, 255)) ;
,
return ffi_brush;
}
return hbr;
.
再次运行Graphic程序,这时就可以看到编辑框控件的背景完全变成蓝色,文字是红色的了。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -