目錄
設置對話框背景顏色
常用控件及對應類
創建模態/非模態對話框
為對話框控件添加關聯變量
(本章節中例子都是用 VS2005 編譯調試的)
設置對話框背景顏色
[利用 OnPaint 來實現修改對話框背景顏色][利用 OnCtlColor 實現修改對話框背景顏色]
利用 OnPaint 來實現修改對話框背景顏色
說明: 在窗口重繪時候獲得資源 DC 然后 FillSolidRect 函數用指定顏色填充整個對話框客戶區域來實現修改對話框背景色
流程圖:
代碼樣例:

void CtestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用於繪制的設備上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使圖標在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 繪制圖標 dc.DrawIcon(x, y, m_hIcon); } else { /* 利用 OnPaint 函數修改對話框背景色 *************************************************/ CRect rect; //這里用的是 CPaintDC 它在構造函數時候會獲取 DC,析構函數時候會釋放 DC. //所示我們可以除去獲取 DC 和釋放 DC 兩個步驟 CPaintDC dc(this); //獲得對話框客戶區矩形 GetClientRect(rect); //填充對應顏色 dc.FillSolidRect(rect,RGB(0,0,255)); //設置為綠色背景 CDialog::OnPaint(); } }
利用 OnCtlColor 實現修改對話框背景顏色
說明
要設置對話框背景顏色,必須重載OnCtlColor函數,其對應的Windows消息為WM_CTLCOLOR. 在OnCtlColor函數中返回一個自己定義的畫刷.
OnCtlColor 是響應WM_CTLCOLOR消息的函數.當子控件將要被繪制的時候,就會發送一個WM_CTLCOLOR消息給它的父窗口(通常是對話框),父窗口准備正確的顏色來繪制子窗口.在一個對話框中,每一個控件的繪制都會發送這個消息,也就是說這個OnCtlColor函數會被調用多次.OnCtlColor是一個虛函數,在沒有被覆蓋之前,直接調用父類的OnCtlColor函數,返回一個畫刷句柄,並用這個返回的畫刷句柄去繪制這個控件.因此,我們可以在這個函數中來設置控件的背景和控件上文字的顏色、文字字體及文字的背景色,但是對於Button控件,卻不能直接來改變背景顏色
OnCtlColor 函數
函數原型
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
參數說明
- pDC: 指向當前要繪制的控件的顯示上下文的指針
- pWnd: 指向當前要繪制的控件的指針
- nCtlColor: 傳給函數要設置的控件類型
值 解釋
CTLCOLOR_MSGBOX 更改消息框控件
CTLCOLOR_EDIT 更改編輯框
CTLCOLOR_LISTBOX 更改列表框控件
CTLCOLOR_BTN 更改按鈕顏色
CTLCOLOR_DLG 更改對話框背景色
CTLCOLOR_SCROLLBAR 更改滑動條
CTLCOLOR_STATIC 更改靜態文本
CTLCOLOR_MAX可以根據不同的控件類型返回不同的畫刷,來實現不同控件顏色的設置
流程圖
代碼樣例
方法一(利用 CBrush)
在對話框類中添加 CBrush 成員對象
CBrush m_B;
在初始化對話框 OnInitDialog 成員函數中創建畫刷對象
m_B.CreateSolidBrush(RGB(0,0,255));
在 OnCtlColor 函數中設置對話框背景色
//設置對話框背景色 if(nCtlColor == CTLCOLOR_DLG) return (HBRUSH)m_B.GetSafeHandle(); //或者 return m_B;
方法二(利用 HBRUSH 句柄)
在 OnCtlColor 函數中利用新建 HBRUSH 句柄設置對話框背景色
//設置對話框背景色 if(nCtlColor == CTLCOLOR_DLG) { //創建畫刷 HBRUSH B = CreateSolidBrush(RGB(0,0,255)); return B; }
常用控件及對應類
編輯框
- 接受換行符: 在資源對話框中屬性頁面中的 Want Return 設置為 true 並且( MultiLine要為 true )
- 多行編輯框: MultiLine要為 true
MSDN鏈接
設置控件文本的方式
- GetDlgItem()->GetWindowText()/SetWindowText()
- GetDlgItemText()/SetDlgItemText()
- GetDlgItemInt()/SetDlgItemInt()(只適合編輯框文本中輸入的為數值)
- 將控件和控件變量相關聯然后通過這個控件變量調用對應的函數對編輯框中的文本進行操作
創建模態/非模態對話框
模態對話框
步驟:
代碼示例:
添加個對話框資源文件,並在上面創建一個按鈕,資源 ID 為 IDD_DIALOG1 ,資源視圖如下:
並把這個資源對象關聯一個 CDialog 派生類,然后為對話框資源上的按鈕添加單擊消息映射代碼如下:

/* 派生類 .h 文件內容 *******************************/ class CMyDialog : public CDialog { DECLARE_DYNAMIC(CMyDialog) public: CMyDialog(CWnd* pParent = NULL); // 標准構造函數 virtual ~CMyDialog(); // 對話框數據 enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButton1(); }; /* 派生類 .cpp 文件內容 *******************************/ IMPLEMENT_DYNAMIC(CMyDialog, CDialog) CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyDialog::IDD, pParent) { } CMyDialog::~CMyDialog() { } void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CMyDialog::OnBnClickedButton1) END_MESSAGE_MAP() // CMyDialog 消息處理程序 void CMyDialog::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 //關閉模態對話框 EndDialog(0); }
在主對話框上添加一個按鈕,然后添加事件響應添加代碼如下:
CMyDialog dlg;
dlg.DoModal();
運行結果
非模態對話框
步驟:
代碼示例:
添加個對話框資源文件,並在上面創建一個按鈕,資源 ID 為 IDD_DIALOG1 ,資源視圖如下:
並把這個資源對象關聯一個 CDialog 派生類,然后為對話框資源上的按鈕添加單擊消息映射代碼如下:

/* 派生類 .h 文件內容 *******************************/ class CMyDialog : public CDialog { DECLARE_DYNAMIC(CMyDialog) public: CMyDialog(CWnd* pParent = NULL); // 標准構造函數 virtual ~CMyDialog(); // 對話框數據 enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButton1(); }; /* 派生類 .cpp 文件內容 *******************************/ IMPLEMENT_DYNAMIC(CMyDialog, CDialog) CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyDialog::IDD, pParent) { } CMyDialog::~CMyDialog() { } void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CMyDialog::OnBnClickedButton1) END_MESSAGE_MAP() // CMyDialog 消息處理程序 void CMyDialog::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 //關閉非模態對話框 DestroyWindow(); }
在主對話框上添加兩個按鈕,然后添加事件響應中添加代碼如下:
/* 創建非模態對話框按鈕事件響應函數中添加代碼 ***************/ //防止 m_dlg 在已經創建對話框資源 //並與對話框資源關聯時候再次創建對話框 if(!m_dlg.GetSafeHwnd()) { //創建對話框 m_dlg.Create(IDD_DIALOG1); //顯示對話框 m_dlg.ShowWindow(SW_SHOWNORMAL); } /* 關閉非模態對話框按鈕事件響應函數中添加代碼 ***************/ //關閉對話框 m_dlg.DestroyWindow();
運行結果:
為對話框控件添加關聯變量
添加關聯變量
利用向導
添加控制變量
添加值變量
手動添加代碼
添加關聯控制/值變量
為類先添加關聯的控制變量以上面圖片位例子:
CEdit m_edit; //編輯框關聯的控制變量 CString m_edit2; //編輯框關聯的值變量
在 DoDataExchange 函數中添加控件與變量的關聯,便完成了控件與變量的關聯
void CtestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //關聯必須只能在 CDialog::DoDataExchange(pDX); 下添加 //將控件與控制變量相關聯 DDX_Control(pDX, IDC_EDIT1, m_edit); //將控件與值變量相關聯 DDX_Text(pDX, IDC_EDIT1, m_edit2); }
使用關聯變量
在使用控件關聯變量時候要注意,並不是控件與關聯變量的狀態是保持一致的,需要手動調用 CWnd 的 UpdateData 函數來保持控件的狀態和關聯變量的一致性.
- 用關聯變量值更新到控件上時需要用 UpdateData(FALSE); 來完成.
- 用關聯變量接收控件的改變需要調用 UpdateData(); 來完成.