系統環境: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 CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
- {
- HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
- //在這加一條是否為對話框的判斷語句
- if(nCtlColor ==CTLCOLOR_DLG)
- return m_brush; //返加綠色刷子
- 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 靜態文本框、矩形等。
http://blog.csdn.net/akof1314/article/details/4952372