⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10.6.2 仅改变某个子控件的背景及文本颜色.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 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 + -