系統環境:Windows 7
軟體環境:Visual C++ 2008 SP1
本次目的:為對話框設定背景顔色、控件顔色
既然MFC對話框不好開發,那麼現在我們來開始美化我們的對話框。為對話框設定背景顔色、控件顔色等等。
對話框背景顔色:
網上流傳有四種方法(可能還不止),在VC++2008SP1測試後,發現隻有三種可以使用了,其中第一種被廢棄了。以下是四種方法:
方法一 (失效):調用CWinApp類的成員函數SetDialogBkColor來實作。
其中函數的第一個參數指定了背景顔色,第二個參數指定了文本顔色。下面的例子是将應用程式對 話框設定為藍色背景和紅色文本,步驟如下:
① 建立一個基于Dialog的MFC AppWizard應用程式ExampleDlg。
② 在CExampleDlgApp ::InitInstance()中添加如下代碼:
BOOL CExampleDlgApp: : InitInstance ( )
{
… CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()調用,将對話框設定為藍色背景、紅色文本
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
int nResponse = dlg.DoModal();
…}
編譯并運作,此時對話框的背景色和文本色已發生了改變。值得注意的是:在調用DoModal()之前必須先調用SetDialogBkColor,且此方法是将改變應用程式中所有的對話框顔色,并不能針對某一個指定的對話框。
方法二 :重載OnPaint(),即WM_PAINT消息。有關代碼如下(以上例工程為準):
void CExampleDlgDlg::OnPaint()
if (IsIconic())
…
else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(0,255,0)); //設定為綠色背景
CDialog::OnPaint();
}
}
方法三 :重載OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具體步驟如下(以上例工程為準):
①在CExampleDlgDlg的頭檔案中,添加一個CBrush的成員變量:
class CExampleDlgDlg : public CDialog
{...
protected:
CBrush m_brush;
...
};
②在OnInitDialog()函數中添加如下代碼:
BOOL CExampleDlgDlg::OnInitDialog()
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一綠色刷子
}
③利用ClassWizard重載OnCtlColor(…),即WM_CTLCOLOR消息:
HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
/*
** 這裡不必編寫任何代碼!
**下行代碼要注釋掉
** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
*/
return m_brush; //返加綠色刷子
方法四 :還是重載OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具體步驟如下(以上例工程為準):
步驟①、②同上方法三中的步驟①、②。
步驟③利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//在這加一條是否為對話框的判斷語句
if(nCtlColor ==CTLCOLOR_DLG)
return hbr;
}
控件顔色:
對于分布在對話框上的控件,我們可以修改其顔色、其背景顔色,比如對靜态文本、文本編輯框、清單框等等。
步驟①、②同上方法三中的步驟①、②。
步驟③:利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor ==CTLCOLOR_DLG) //對話框顔色
return m_brush; //返加綠色刷子
if(nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC) //靜态文本顔色,并且指定控件ID号
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(191,219,255)); //靜态控件的背景顔色設定,這裡設定于背景顔色一緻,則可以免設定透明
//pDC->SetBkMode(TRANSPARENT); //模式設定透明的話,則忽略靜态控件的背景顔色設定,與對話框顔色融合
hbr=(HBRUSH)m_brush;
}
if(nCtlColor==CTLCOLOR_EDIT) //文本編輯框顔色
pDC->SetTextColor(RGB(0,0,255));
//pDC->SetBkColor(RGB(191,219,255)); //靜态控件的背景顔色設定
pDC->SetBkMode(TRANSPARENT);
hbr=(HBRUSH)m_brush;
}
return hbr;
}
效果如下:
對于其中nCtlColor類型,即它的取值:
CTLCOLOR_DLG 對話框
CTLCOLOR_EDIT 編輯框
CTLCOLOR_LISTBOX 清單框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滑動條
CTLCOLOR_STATIC 靜态文本框、矩形等。