作者:重庆全景公司来源:http://www.bd6vr.com/访问:194时间:2023-03-14
对于基于对话框类的 MFC 项目,自然得清楚对话框类的结构,包含的成员函数、虚函数等。项目创建完以后,至少得清楚自动生成的函数是用来干什么的,如何添加合适的代码在什么函数的什么位置,以及如何重写虚函数或者创建消息映射等,这些就是本经验的目的所在。
工具/原料
· Visual studio 2013
方法/步骤
1. 首先看看对话框类的继承关系,新建的项目类派生于 CDialogEx 类,CDialogEx 在 CDialog类的基础上进行了扩展,而 CDialog 派生于窗口类 CWnd,说明对话框也属于一种窗口。这样对于对话框类的继承关系就有了一定了解。
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 用来初始化对话框。
3. 打开源文件可以看到各个函数的定义,“关于”对话框类的成员函数和消息映射也在这里,不多述。先讲述构造函数 CDemoDlg(),通过类向导生成的自定义变量或者控件的关联变量都会在构造函数中初始化一个值,不过开发者也可以直接在头文件定义变量,并手动在构造函数中添加初始化语句。所以说,构造函数是个赋初值的好地方。
4. 再来看 DoDataExchange 函数,在对话框中添加新的控件并通过类向导定义了相关变量后,都会在这个用于数据交换的函数中说明,添加变量的最大最小值也会在这里体现。
5. 下面是消息映射,定义了所有消息的来源和处理函数,比如本例中添加的按钮按下消息,就是对于 消 息 映 射 中 的 ON_BN_CLICKED(IDC_BUTTON1,&CDemoDlg::OnBnClickedButton1)对于自定义消息或者某些无法通过类向导完成的消息,可以手动在这里添加映射关系,并在别处添加对应的处理函数。
6. 初始化函数 OnInitDialog,默认用来设置图标和菜单,很多时候有些操作需要在启动对话框前就做好,比如说某些控件的初始状态(按钮是否可视、是否可操作),这些初始化的设置都可以在 OnInitDialog 函数中添加,最好在提示语“// TODO: 在此添加额外的初始化代码”的下面添加。
7. 系统指令响应函数 OnSysCommand,默认处理窗口最小化和最大化指令等,并会根据是否选中“关于”决定是否弹出“关于”对话框。这个函数一般不需要修改。
8. 绘图消息响应函数 OnPaint 用于绘制窗口和图标,其中 CRect 是个存储窗口大小的结构体。OnQueryDragIcon 函数用于返回光标,这不多讲。
9. 默认生成的函数就这么多,其他常用的消息有定时器消息 WM_TIMER、窗口关闭消息WM_CLOSE、应用程序结束消息 WM_DESTROY、按钮按下消息 WM_KEYDOWN 等。而常用的虚函数一般有 PreTranslateMessage、PreCreateWindow 等,这些以后用到再具体说明。