?? 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 + -