天天看點

VC 對話框背景顔色、控件顔色

系統環境: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;

效果圖,在基于上一篇的位圖按鈕 ,看看是否與背景蠻和諧的:

VC 對話框背景顔色、控件顔色

控件顔色:

對于分布在對話框上的控件,我們可以修改其顔色、其背景顔色,比如對靜态文本、文本編輯框、清單框等等。

步驟①、②同上方法三中的步驟①、②。

步驟③:利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor ==CTLCOLOR_DLG) //對話框顔色

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);

return hbr;

效果如下:

VC 對話框背景顔色、控件顔色

對于其中nCtlColor類型,即它的取值:

CTLCOLOR_DLG   對話框 

CTLCOLOR_EDIT   編輯框 

CTLCOLOR_LISTBOX   清單框   

CTLCOLOR_MSGBOX   消息框 

CTLCOLOR_SCROLLBAR   滑動條 

CTLCOLOR_STATIC   靜态文本框、矩形等。

繼續閱讀