上一篇:MFC界面编程基础(09):菜单(二) | 下一篇:MFC界面编程基础(11):静态文本框、命令按钮和编辑框 |
---|
MFC 是 Visual C++ 的核心。虽然在 Windows 应用程序中可以直接调用 API 函数,但是一般不经常直接调用,而是从 MFC 类创建对象并调用属于这些对象的成员函数。MFC 是 Microsoft 公司提供的用来编写 Windows 应用程序的 C++ 类库,MFC 大约有 200 多个类,可以分成两种:一是 Cobject 类的派生类,它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体的 Windows 实体对应;二是非 Cobject 派生类,这些都是独立的类,如表示点的 CPoint 类,表示矩形的 CRect 类。
在 Visual C++ 中,可以创建以下 3 类典型的 Windows 应用程序,它们都是通过 MFC AppWizard(exe) (以下简称 AppWizard )向导创建的:
有两种对话框: 模态对话框(Modal)和非模态对话框
//弹出模态对话框,有阻塞(效果是弹出对话框后会停留在这个界面)
CTestDlg dlg;
dlg.DoModel(); //显示模态对话框
BOOL Create(LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create(UNIT nIDTemplate, CWnd* pParentWnd = NULL);
返回值:
如果对话框创建和初始化成功,则返回非零值,否则为0。
参数:
lpszTemplateName 对话框模板的名称。
nIDTemplate 对话框资源的ID。
pParentWnd 指向含有对话框的父窗口对象的指针。如果为NULL,对话框对象的父窗口设置为应用的主窗口。
利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将这个对话框显示出来。
//弹出非模态对话框,无阻塞(效果是弹出对话框后会立马关闭,一闪而过的样子)
CTestDlg dlg;
dlg.Create(IDD_DIALOG1, this);//创建
dlg.ShowWindow(SW_SHOW); //显示
//ShowWindow() 函数在 CWnd:ShowWindow() 中,因为CTestDlg 属于CDialog 类,CDialog 的父类就是CWnd (类的层次结构图中可查找到)
执行程序发现仍然没有弹出测试对话框,问题就出在创建的非模态对话框是一个局部对象,函数结束后,对话框的生命周期也就结束了。在创建非模态对话框时不能将其定义为局部对象。有两种解决方法:
1.把对话框对象定义为类的成员变量,主要按照以下两个操作步骤:
①:在主对话框的 .h 文件中添加成员变量,同时将事件处理程序中的 CTestDlg dlg; 注释掉;
#include“TestDlg .h”
……
private:
CTestDlg dlg;
若只是这样,当第一次点击按钮时会弹出非模态对话框,也不会闪退,而当你关闭这个非模态对话框后再次点击按钮,程序会崩溃,原因是 dlg.Create(IDD_DIALOG1, this); 执行了两次,所以需要进行第②步操作
②:将创建窗口的函数移到主对话框的初始化函数OnInitDialog中,同时将事件处理程序中的dlg.Create(IDD_DIALOG1, this); 注释掉,确保窗口只创建一次,因为创建多次会崩溃,最后实际上就是当每次点击按钮,事件处理程序中只负责显示窗口就OK了;
BOOL XXXXX:OnInitDialog()
{
……
//TODO:在此添加额外的初始化代码
dlg.Create(IDD_DIALOG1, this);//创建
}
如果选择在堆上分配内存,关闭对话框时就需要释放堆内存,释放的方式有两种:
void MyDialog::PostNcDestroy()
{
// TODO: 在此添加专用代码和/或调用基类
delete this;
CDialogEx::PostNcDestroy();
}
程序的创建过程:
用 AppWizard 创建基于对话框的应用程序框架(假定工程名为 Dialog )后,项目工作区上增加了一个“ 资源视图 ”选项卡。
注1:当点击一个按钮需要弹出一个另外一个对话框,通常分以下几个步骤:
①:在资源视图中的Dialog中添加一个新的对话框(即你点击按钮需要显示的这个对话框)
②:在生成的新对话框中右键->添加类(类名自定义),将其对应到一个类中,然后会生成对应的 .h /.cpp 文件
③:在按钮的时间处理程序中使用这个类,并通过这个类创建一个对象,然后操作对象让对话框显示出来(模态的或者非模态的)
注2:给按钮添加点击事件的处理程序的常用三种方法:
①:点击按钮右键属性->控制事件(闪电图标)->BN_CLICKED(单次点击)->下拉列表出现字样然后点击进入编辑
②:点击按钮右键属性->添加事件处理程序->点击进入编辑消息类型等等
③:双击此按钮,直接创建一个事件处理程序
注3:在MFC中一个类的名称通常以一个大写的C开头,但是在别的文件中引用这个头文件的时候不用带C
例如:类名 CDlgExec ,只需 #include “DlgExec.h”
上一篇:MFC界面编程基础(09):菜单(二) | 下一篇:MFC界面编程基础(11):静态文本框、命令按钮和编辑框 |
---|