mfc对话框程序,基于对话框的mfc应用程序实例
首先,创建一个对话框对象
1.首先,使用资源编辑器创建一个对话框资源,并为对话框资源定义一个对话框类:class CTestDlg: public CDialog。
2.创建一个对话框对象。
创建模式对话框:
比如:
CTestDlg dlg
dlg。DoModal();
无模式对话框创建:
比如:
CTestDlg dlg
dlg。Create(IDD_DIALOG,this);
但是你不能得到一个正常显示的非模态对话框。因为模态对话框和非模态对话框的实现方式不一样,所以这里要注意几点。
创建无模式对话框后,它是隐藏的,必须通过调用ShowWindow来显示。对于模态对话框,当执行DoModal函数来创建对话框时,程序将暂停执行,直到模态对话框关闭。因此,模态对话框可以采用局部对象。
但是,对于非模态对话框,当执行Create函数时,不会暂停执行。当执行花括号 }时,Dlg本地对象的生命周期被破坏,然后出现异常。
有两种解决方案:
1.在视图类中定义一个CTestDlg成员变量。
其次,动态创建一个CTestDlg变量,重写CTestDlg类的PostNcDestroy函数,在这个函数中销毁对象delete this无论您创建的是模式对话框还是非模式对话框,当我们单击“确定”或“取消”时,对话框都会消失。但是这个时候,下层的操作就不一样了。
对于模态对话框,对话框对象此时确实被销毁了,但是对于非模态对话框,它们只是被隐藏,不再显示。这要求我们自己调用DestoryWindow函数来进行销毁。
这时我们必须重写CTestDlg的OnOK和OnCancel函数(基类CDialog的这两个虚函数),调用这两个函数中的DestroyWindow函数,注意不要再调用基类CDialog的对应函数。
正确创建无模式对话框的代码如下:
CTestDlg * pDlg=new CTestDlg
pDlg- Create(IDD_DIALOG,this);
pDlg-SHOW window(SW _ SHOW);
同时销毁CTestDlg类的PostNcDestroy函数中的对象:删除这个;
二、动态创建按钮
1.在对话框类CTestDlg中定义一个CButton类对象作为其成员变量。
2.在相应的消息处理中,调用CButton类的Create函数来创建按钮。
注意两点:
如果在调用CButton:Create创建按钮时没有指定WS_VISIBLE样式,那么必须调用这个Button对象的ShowWindow函数来显示按钮。为了防止该按钮与多个按钮相关联,需要在这里进行一些设置,如下所示:
如果(!m_btn.m_hwnd)
{
//CButton对象m_btn不与按钮相关联。
m_btn。创建(.);
}
其他
{
//CButton对象m_btn已经与一个按钮相关联。
其他操作.
}
当然,这不是唯一的方法。但这是最美的方式。
第三,设置控件文本。
1.以下是一些用于设置控制文本的函数:
//获取对话框中指定控件的窗口句柄。由控件ID标识指定。
CWnd * GetDlgItem(int nID)const;
void CWnd:GetDlgItem( int nID,HWND * ph wnd)const;
//获取窗口文本
int GetWindowText(LPTSTR lpsztringbuf,int nmax count)const;
void GetWindowText(CString RS tring)const;
//设置窗口文本
void SetWindowText(LPCTSTR lpszString);
//获取指定的控制窗口文本。由控件ID标识指定。
int GetDlgItemText( int nID,LPTSTR lpStr,int nmax count)const;
int GetDlgItemText( int nID,CString RS tring)const;
//设置指定的控制窗口文本。由控件ID标识指定。
void SetDlgItemText( int nID,LPCTSTR lpszString);
//获取指定的控制窗口文本,并将其转换为UINT类型返回。由控件ID标识指定。
UINT GetDlgItemInt( int nID,BOOL* lpTrans=NULL,BOOL b signed=TRUE)const;
//设置指定控件的窗口文本,按UINT类型转换为字符。由控件ID标识指定。
void SetDlgItemInt( int nID,UINT nValue,BOOL b signed=TRUE);
2.可以为对话框控件关联一个变量,在CTestDlg类的DoDataExchange中更新和交换数据。
这里我们需要重点关注DoDataExChange函数:
首先,引用MSDN的一个解释:被框架调用来交换和验证对话数据。意味着框架调用这个函数来重写和确认对话数据。
实际上,DoDataExChange函数主要通过DDX _文本(.)或DDX _控制(.).
我只是从我的MSDN里取了一个定义:
void afx API DDX _ Text(CDATA exchange * pDX,int nIDC,字节值);
其实也很简单,没那么复杂。如下所示:
value=GetDlgItemInt(nIDC);
SetDlgItemInt(nIDC,value);
在UpdateData函数内部调用了DoDataExchange函数。
该函数只有一个布尔参数,决定数据传输的方向:
调用UpdateData(TRUE)将数据从对话框的控件传输到相应的数据成员。调用UpdateData(FALSE)将数据从数据成员传输到相应的控件。
UpdateData(FALSE)将变量的值传递给控件。
UpdateData(TRUE)是从控件到关联变量的值。
第四,对话框扩展功能的实现
只与两个功能相关联:
//获取指定窗口边框的折叠大小。
void GetWindowRect(LPRECT LPRECT)const;
//设置指定窗口(控件)的位置和大小
BOOL SetWindowPos(const CWnd * pwndiserafter,intx,inty,int cx,intcy,UINTnFlags);
第五,逃生按钮的实现
1.基于对话框创建MFC程序。删除原控件后,再添加两个按钮,并将这两个按钮的名称改为‘你能抓住我吗?’
2.打开类视图并定义一个新类CNewButton。这个新类的基类是CButton。并为此类添加一个成员变量:CNewButton * m _ pbtn
3.打开资源视图,分别为两个按钮创建两个CNewButton类关联变量:m _ BTN1和m _ BTN2
4.在CXXXDlg中重写其OnInitDialog函数。主要新增内容:
m _ Bt n1 . m _ pbtn=m _ Bt N2;
m _ Bt N2 . m _ pbtn=m _ Bt n1;
5.对于CNewButton类,它必须有OnMouseMove函数。主要新增内容:
ShowWindow(SW _ HIDE);
m _ pbtn-SHOW window(SW _ SHOW);
编译,连接。好
不及物动词属性页、属性表单和向导的建立
1.创建属性页
打开资源编辑器,单击对话框资源并在列出的选项中选择:IDD_PROPPAGE_LARGE。创建属性页资源。
之后,我们可以在上面添加其他控件来完善我们的属性页。后面会讲到属性页的完美操作。
属性页资源完善后,为每个属性页关联一个类。
2.创建属性表单
打开类视图并添加一个新类CPropSheet,其基类是CPropertySheet。
然后为其添加属性页类对象,并在其构造函数中使用AddPage函数将属性页添加到表单中。
3.消息响应
在主菜单的末尾再增加一个菜单项,在这个菜单上增加一个消息响应功能。
在此响应函数中创建属性表:
CPropSheet propSheet(TEXT(属性表));
支撑板。DoModal();
4.向导的创建
若要创建向导类型的对话框,您应该按照创建标准属性窗体的步骤进行操作。
但是,在调用属性表单对象的DoModal函数之前,应该首先调用SetWizardMode函数来声明您正在将属性表单构建为向导。
因此,应该在DoModal函数之前添加以下代码:
支撑板。SetWizardMode();
5.属性页的完美操作
首先,我们要注意属性页,三个不同时期的关键操作:
当属性表中的属性页被选中并成为活动页时,应用程序框架将调用OnSetActive函数。
OnSetActive是其基类的虚函数。我们可以重写这个函数,在里面做一些操作。假设我们当前在属性表中的属性页上。当我们点击Next,将进入下一个属性页时,应用框架将调用OnWizardNext函数。
OnWizardNext是其基类的虚函数。我们可以重写这个函数,在里面做一些操作。
还有类似的OnWizardBack和OnWizardFinish函数。创建属性页时,会调用其OnInitDialog函数。
我们可以在这个函数中对属性页中的控件执行一些操作。例如在列表框或下拉框中添加字符串。出发地:http://blog..net/ltag0110rtag/article/details/7369105