对话框设置及常用控件,创建模/非模态对话框态对话框(VC_MFC)
目录
设置对话框背景颜色
常用控件及对应类
创建模态/非模态对话框
为对话框控件添加关联变量
(本章节中例子都是用 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(); 来完成.