VS2013/MFC基于对话框编程:[4]对话框类
1、首先看看对话框类的继承关系,新建的项目类派生于CDialogEx类,CDialogEx在CDialog类的基础上进行了扩展,而CDialog派生于窗口类CWnd,说明对话框也属于一种窗口。这样对于对话框类的继承关系就有了一定了解。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/604e9556ad042e68a8e0d75285f85856d53dd15c.jpg)
2、打开项目的头文件,最上面的#pragma once表示后面的头文件只编译一次;默认生成的函数有:
CDemoDlg(CWnd* pParent = NULL); // 标准构造函数
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP() // 消息映射的声明
三个消息在前一经验已经介绍过,构造函数自然是创建对话框时自动调用,DoDataExchange函数用于存放各类控件的变量信息,OnInitDialog用来初始化对话框。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/5917cb3da824d8e90adb3dd5da598540102ac85c.jpg)
3、打开源文件可以看到各个函数的定义,“关于”对话框类的成员函数和消息映射也在这里,不多述。先讲述构造函数CDemoDlg(),通过类向导生成的自定义变量或者控件的关联变量都会在构造函数中初始化一个值,不过开发者也可以直接在头文件定义变量,并手动在构造函数中添加初始化语句。
所以说,构造函数是个赋初值的好地方。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/50189b40102a04e2f2abbcf12b7aa010bc33c25c.jpg)
4、再来看DoDataExchange函数,在对话框中添加新的控件并通过类向导定义了相关变量后,都会在这个用于数据交换的函数中说明,添加变量的最大最小值也会在这里体现。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/05a320a23a42a07a6f193a80673834bb19efc15c.jpg)
5、下面是消息映射,定义了所有消息的来源和处理函数,比如本例中添加的按钮按下消息,就是对于消息映射中的ON_BN_CLICKED(IDC_BUTTON1, &CDemoDlg::OnBnClickedButton1)
对于自定义消息或者某些无法通过类向导完成的消息,可以手动在这里添加映射关系,并在别处添加对应的处理函数。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/3b03be7aa010bc333d31b20892efa25f0c143f5d.jpg)
6、初始化函数OnInitDialog,默认用来设置图标和菜单,很多时候有些操作需要在启动对话框前就做好,比如说某些控件的初始状态(按钮是否可视、是否可操作),这些初始化的设置都可以在OnInitDialog函数中添加,最好在提示语“// TODO: 在此添加额外的初始化代码”的下面添加。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/18aebc5f0c14c27b058b003a2a46b7b1eef9395d.jpg)
7、系统指令响应函数OnSysCommand,默认处理窗口最小化和最大化指令等,并会根据是否选中“关于”决定是否弹出“关于”对话框。这个函数一般不需要修改。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/a007a9b1eef97fbd9175b200b74133bad341335d.jpg)
8、绘图消息响应函数OnPaint 用于绘制窗口和图标,其中CRect是个存储窗口大小的结构体。OnQueryDragIcon函数用于返回光标,这不多讲。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/3d002dbad341037d023e4fc5a9bc7dc5cf672d5d.jpg)
9、默认生成的函数就这么多,其他常用的消息有定时器消息WM_TIMER、窗口关闭消息WM_CLOSE、应用程序结束消息WM_DESTROY、按钮按下消息WM_KEYDOWN等。而常用的虚函数一般有PreTranslateMessage、PreCreateWindow等,这些以后用到再具体说明。
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/23fd63c5cf672b5f3c4f83253314f4d0b503275d.jpg)
![VS2013/MFC基于对话框编程:[4]对话框类](https://exp-picture.cdn.bcebos.com/d4071b96b814f4d0580a4e61cdfe474ec283235d.jpg)