当前位置:C++技术网 > 资讯 > MFC向导创建基于对话框的项目的类详解

MFC向导创建基于对话框的项目的类详解

更新时间:2015-06-26 19:20:27浏览次数:1+次

    创建基于对话框的过程,创建项目过程简单的描述就是:文件->新建->项目->MFC应用程序->确定->下一步->选择基于对话框->完成。

    然后VS自动将项目创建完毕,我使用的项目名称是cjjjs(C++技术)。
    创建的项目文件列表如下:

解决方案资源管理器
    头文件中,都是各个类的声明的头文件的集合。
     源文件中,则是各个类的实现文件。
     资源文件中,则是各种资源,如rc资源文件、图片等文件所在的地方。此处只是归类显示在这里,实际所有文件都是在一个文件夹中。
    切换到【类视图】标签,则是显示项目中所有的类。这是以类的形式展现,而与文件无关。默认创建完的就是三个类。类视图如下图所示:

类视图
    第一个是CAboutDlg是每个项目都是自动创建的关于对话框,用于显示项目的版本信息的一个对话框。很简单的对话框,和消息对话框一样。
     第二个就是CcjjjsApp,这个是应用程序类。应用程序的启动执行,就是这个类来实现的。稍后会具体介绍。
     第三个是CcjjjsDlg,这个类则是程序的主对话框窗口。窗口上可以放置各种控件。稍后会具体介绍。
 
     然后切换到资源视图标签。VS会将RC资源文件以资源视图形式展现出来,而不是文本格式显示出来。这样便于管理操作。资源视图如下:
 资源视图
    资源视图中的Dialog表示的是对话框资源.程序中出现的对话框,基本都会出现在这里.这里就是关于对话框IDD_ABOUTBOX和主对话框IDD_CJJJS_DIALOG.显示的是两个对话框的ID号。通过这个ID号就可以确定对话框资源了。当然,其他资源也是通过他们的ID号来使用资源的。
     Icon中,则是存放图标的资源,其实就是一个ico格式的图片。IDR_MAINFRAME就是程序默认的图标了。
     String Table则是字符串表,存储程序要用到的各种字符串,集中起来管理,程序中通过函数动态加载。在实现多语言版本时,只需要改这里就行了,而不需要更改源代码。
     Version则是存储程序版本信息的相关的键值对。
 
     以上是整体的基本介绍。下面来具体说说对话框类的各个的作用和详细解释。
 
     在类视图中,双击类名,即可转入类的头文件即类的声明的位置。双击CAboutDlg类名,跳转到了cjjjsDlg.cpp文件,这个文件是CcjjjsDlg类的源文件。不过因为关于对话框类太小了,就集中到主对话框类CcjjjsDlg中来实现了。仅此而已。关于对话框的类的声明和实现都是在这里完成的。对关于对话框类的解释就不在这里说了,我们在主对话框类的解释中,自然会涵盖类的说明。
     双击CcjjjsDlg类,进入这个类的头文件,看到类的声明如下:

#pragma once  // - 防止被包含多次,与#ifndef方式效果一样
// CcjjjsDlg 对话框
class CcjjjsDlg : public CDialog// - 继承于CDialog
{
    // 构造
public:
    CcjjjsDlg(CWnd* pParent = NULL);	// 标准构造函数
    // 对话框数据
    enum { IDD = IDD_CJJJS_DIALOG };// - 与对话框资源关联
protected:
    virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
    // 实现
protected:
    HICON m_hIcon; // - 程序中使用的图标的句柄
    // 生成的消息映射函数
    virtual BOOL OnInitDialog();// - 初始化对话框时要调用的函数
    /* - 下面是处理系统命令的函数 - */
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();// - 窗口绘制消息处理函数
    afx_msg HCURSOR OnQueryDragIcon();// - 处理窗口中拖拽文件
    DECLARE_MESSAGE_MAP()// - 消息映射宏声明
};

类声明简要说明:
1.【与对话框资源关联】是将主对话框C++类与Windows窗口对话框资源关联在一起,主对话框类创建后,然后会绑定主对话框,然后主对话框类对主对话框进行操作管理。这里你可以修改主对话框类管理的对话框,从而修改默认的主对话框。
2.DoDataExchange函数是MFC中用于处理控件变量、数据交换、数据验证的函数。简单来说,就是将控件与控件类变量绑定、同步控件的数据与变量的数据,以及在控件输入数据时根据设定的规则进行数据正确性验证。详细解释,请参考其他相关文章。
3.m_hIcon则是程序用于处理窗口的图标使用的。默认的窗口左上角,任务栏的图标,以及生成的EXE的文件图标等等。
4.OnInitDialog函数是对话框初始化响应的函数,如果窗口在显示前要设置某些控件的值或者是否显示等等,都一般在此函数中设置。
5.OnSysCommand和OnPaint一般不进行处理,除非是要处理系统菜单和绘制窗口等。
6.OnQueryDragIcon函数用于处理窗口中拖拽文件等。一般很少使用,特定场合使用。
7.DECLARE_MESSAGE_MAP是消息响应宏,声明这个之后,在源文件的消息响应实现宏中才可以使用。所有的窗口的消息处理都是在消息映射宏中指定的。
8.以afx_msg开头的函数,都是处理命令和标准消息的响应函数。
下面重点说一说消息映射宏,其他的自己去慢慢了解,其实也不难,这里只是给个大概的解释,让大家对向导生成的对话框项目有个整体的了解。
     消息映射宏是这样的:
BEGIN_MESSAGE_MAP(CcjjjsDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
    ON_BN_CLICKED(IDOK, &CcjjjsDlg::OnBnClickedOk)
END_MESSAGE_MAP()
    消息映射就是将对窗口中的操作的消息与响应的函数关了的意思。而这些响应函数则在各个类中。在类的声明头文件中,以afx_msg开头修饰函数。
     消息映射宏中,里面的每个条目表示一个消息或者命令。比如ON_WM_PAINT(),是一个标准Windows消息,括号中没有参数,因为标准消息有固定的响应函数,无需此处绑定。而 ON_BN_CLICKED则是OK按钮单击后的响应消息响应绑定条目。从ON_BN_CLICKED可以得知,ON_表示消息响应,BN_表示按钮,CLICKED表示单击,合起来就表示按钮单击的消息响应。括号中第一个参数就是按钮的ID,因为窗口中可以有很多按钮,每个按钮都可以单击,所以就要通过ID来区分。而第二个参数就是响应此按钮单击的响应函数。&是取函数的地址,CcjjjsDlg::为类的作用域,表示是在这个类的这个函数,OnBnClickedOk就是这个类中的函数。
     而CcjjjsApp则是应用程序类,用来创建主进程主线程的,只有创建了进程线程,程序才能启动运行。此类的头文件中,还会定义一个全局的应用程序类对象,表示程序的对象。一个程序只有一个全局的应用程序对象。类中还有一个虚函数InitInstance,在应用程序初始化时调用,可以让我们在程序初始化时进行相关准备操作。具体的初始化操作则不在此细讲了。
     整个MFC对话框项目的讲解就是这样了,只是整体的讲讲,具体的深入了解,还需要阅读其他资料和文章。如果有问题,可以留言。