一般情況下,VC中的對話框及控件的顏色大都是灰色的,但一個良好的應用程序,它的界面都是豐富多彩的,那么在VC中怎樣實現窗體及控件的著色呢?
改變窗體的顏色
要改變一個對話框的背景色,可以調用CWin::SetDialogBkColor,它可以改變所有的對話框的顏色。第一參數指定了背景顏色,第二參數指定了文本顏色。
用法如下:
BOOL CSampleApp::InitInstance()
{
...
//set yellow dialog and green text
SetDialogBkColor(RGB(255,255,0),RGB(0,255,0));
...
}
需要重畫對話框(或對話框的子控件)時,Windows向對話框發送消息WM—CTLCOLOR。通常用戶可以讓Windows選擇繪畫背景的刷子,也可以重置該消息指定刷子。下面的說明創建了一個紅色背景對話框的步驟。
首先,給對話框基類增加一個成員變量。
class CMyFormView::public CFormView
{
...
private:
CBrush m—brush ; //background brush
...
};
其次,在類的構造函數中將刷子初始化為所需的背景顏色。
CMyFormView::CMyFormView()
{
// Initialize background brush
m—brush.CreateSolidBrush(RGB(255,0,0));
}
最后,使用ClassWizard處理WM—CTLCOLOR消息并返回一個用來繪畫對話框背景的刷子句柄。由于重畫對話框控件時也要調用該函數,所以要檢測nCtlColor參量。
HBRUSH CMyFormView::OnCtlColor()
{
//determine if drawing a dialog box,
//otherwise let windows handle it
if(nCtlColor==CTLCOLOR—DLG)
return (HBRUSH) m—brush.GetSafeHandle();
return CFormView::OnCtlColor(pDC,pWnd,nCtlColor);
}
改變控件的顏色
需要改變控件的顏色,可以通過兩種方法,其一,可以在父類中指定控件的顏色。其二,利用消息反射在控件類中指定顏色。
當控件需要重新著色時,工作框調用父窗口(通常是對話框)的CWnd::OnCtlColor,可以在父窗口類中重置該函數并指定新的繪畫屬性。
如下所示,將對話框中的編輯控件的文本顏色改為藍色。
HBRUSH CMyDialog::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor)
{
HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
//Draw blue text for edit controls
if(nCtlColor==CLTCOLOR—EDIT)
pDC->SetTextColor(RGB(0,0,255));
return hbr;
}
由于每個窗口必須處理通知消息并指定每個控件的繪畫屬性,所以,這種方法不是完全的面向對象的方法,控件處理該消息并指定繪畫屬性更合理一些。
消息反射允許用戶這樣做,通知消息發給父窗口,若父窗口沒有處理則發給控件,創建一個定制彩色列表框控件,其步驟如下。
首先用ClassWizard創建一個CListBox的派生類,并添加如下的成員變量。
class CMyListBox::public CListBox
{
...
private :
COLORREF m—clrFore; //foreground color
COLORREF m—clrBack; //background color
CBrush m—brush ; //background brush
...
};
其二,在類的構造函數中初始化數據成員。
CMyListBox::CMyListBox()
{
//Initialize data members
m—clrfore=RGB(255,0,0); //red text
m—clrBack=RGB(0,255,0);
//green background
m—brush.CreateSolidBrush(m—clrBack);
}
第三,使用ClassWizard處理反射消息(=WM—CTLCOLOR)并指定新的繪畫屬性。
HBRUSH CMyListBox::CtlColor(CDC* pDC,UINT nCtlColor)
{
pDC->SetTextColor(m—clrFore);
pDC->SetBkColor(m—clrBack);
return (HBRUSH)m—brush.GetSafeHandle();
}
現在控件可以重畫自身,與父窗口無關。
最后,在父窗口頭文件中包含派生的CMyListBox類,然后用ClassWizard
定義列表框控件的成員變量即可。其成員變量的類性為CMyListBox。
這樣我們就完成了控件的著色。