摘自:https://www.cnblogs.com/lidabo/archive/2012/07/19/2598646.html
一、创建对话框对象
1.首先利用资源编辑器创建对话框资源,并针对该对话框资源定义一个对话框类:class CTestDlg : public CDialog
2.创建话话框对象
模态对话框的创建:
如:
CTestDlg dlg;
dlg.DoModal();
非模态对话框创建:
如:
CTestDlg dlg;
dlg.Create(IDD_DIALOG, this);
但这样是得不到一个正常显示的非模态对话框的。因为模态与非模态对话框的实现方式并不相同,这里我们还要注意几点。
正确地创建非模态对话框的代码如下:
CTestDlg *pDlg = new CTestDlg;
pDlg->Create(IDD_DIALOG, this);
pDlg->ShowWindow(SW_SHOW);
同时,在CTestDlg 类的 PostNcDestroy函数中销毁对象:delete this;
二、动态创建按钮
1. 在对话框类CTestDlg 中定义一个 CButton 类对象,作为其成员变量。
2. 在相应的消息处理中,调用 CButton类的Create函数创建按钮。
要注意两点:
三、设置控件文本文字
1.下面列举几个用来设置控件文本文字的函数:
// 取得对话框中指定控件的窗口句柄。控件通过ID标识来指定
CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;
// 取得窗口文本
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;
void GetWindowText( CString& rString ) const;
// 设置窗口文本
void SetWindowText( LPCTSTR lpszString );
// 取得指定控件窗口文本。控件通过ID标识来指定
int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;
int GetDlgItemText( int nID, CString& rString ) const;
// 设置指定控件窗口文本。控件通过ID标识来指定
void SetDlgItemText( int nID, LPCTSTR lpszString );
// 取得指定控件窗口文本,并转化为UINT 类型返回。控件通过ID标识来指定
UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;
// 设置指定控件窗口文本,由UINT类型转化为字符 。控件通过ID标识来指定
void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE );
2.可以为对话框控件关联一个变量,在CTestDlg 类的DoDataExchange来完成数据的更新与交换。
这里我们需要重点说明 DoDataExChange 函数:
首先引用MSDN的一段解释吧:Called by the framework to exchange and validate dialog data。意指框架调用此函数来改写与确认对话框数据。
其实DoDataExChange函数主要是通过DDX_TEXT(....) 或 DDX_CONTROL(....) 来实现数据的实时关联的。
我从我的MSDN中随便拿来一个定义:
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, BYTE& value );
其实这个要关联的话也很简单,没有那么复杂。如下:
value = GetDlgItemInt(nIDC);
SetDlgItemInt(nIDC, value);
而DoDataExchange 函数是在UpdateData函数内部调用的。
该函数只有一个布尔型参数,它决定了数据传送的方向:
UpdateData(FALSE) 是将变量的值传到控件.
UpdateData(TRUE) 是从控件中取值到关联的变量
四、对话框伸缩功能的实现
只关联到两个函数:
// 取得指定窗口边框折尺寸
void GetWindowRect( LPRECT lpRect ) const;
// 设置指定窗口(控件)的位置同尺寸
BOOL SetWindowPos( const CWnd* pWndInsertAfter, intx, inty, int cx, intcy, UINTnFlags );
五、逃跑按钮的实现
1. 创建一个基于对话框的MFC 程序,删除原有的控件后,再添加两个按钮,更改两按钮名为"你能抓到我吗?"
2.打开类视图,定义一个新类CNewButton,这个新类的基类为CButton。并为此类添加一个成员变量:CNewButton *m_pbtn;
3.打开资源视图,分别为两个按钮创建两个CNewButton类关联变量:m_btn1, m_btn2;
4.在CXXXDlg中改写其OnInitDialog函数。主要添加:
m_btn1.m_pbtn = &m_btn2;
m_btn2.m_pbtn = &m_btn1;
5.对于CNewButton 类,必定其OnMouseMove函数。主要添加:
ShowWindow(SW_HIDE);
m_pbtn->ShowWindow(SW_SHOW);
编译,连接。 OK
六、属性页、属性表单与向导的建立
1.创建属性页
打开资源编辑器,点击Dialog 资源并在列出的选项中,选择:IDD_PROPPAGE_LARGE。建立属性页资源。
之后,我们就可以其上添加其他控件来完善我们的属性页。关于属性页的完善操作我们在后面会谈到。
属性页资源完善后,再为每一个属性页关联一个类。
2.创建属性表单
打开类视图,添加新类CPropSheet,其基类为CPropertySheet。
之后再为其添加属性页类对象,并在其构造函数中利用AddPage函数将属性页添加到表单上。
3.消息响应
再主菜单的最后再增加一个菜单项,并为此菜单添加消息响应函数。
在此响应函数中创建属性表单:
CPropSheet propSheet(TEXT("属性表单"));
propSheet.DoModal();
4.向导的创建
创建一个向导类型的对话框,应该遵循创建一个标准属性表单的步骤来实现。
但在调用属性表单对象的DoModal函数之前,应该先调用SetWizardMode函数,来声明建立的是一个作为向导的属性表单。
所以,应在DoModal函数之前添加如下代码:
propSheet.SetWizardMode();
5.属性页的完善操作
首先我们要注意到属性页,在三个不同时期的关键性操作: