MFC窗口创建过程的研究

2014-07-18 07:11卫洪春彭小利蒲国林
现代电子技术 2014年11期

卫洪春 彭小利 蒲国林

摘 要: VC开发环境中的Win32 Application生成窗口应用程序,结构简单清晰,MFC生成窗口应用程序的过程相当复杂。为了剖析MFC生成窗口应用程序的具体过程,深入分析了MFC框架的源代码及其调用关系,结合C++面向对象技术的封装、继承、多态、编译预处理等机制,设计了一个模拟系统,用以模拟MFC生成窗口应用程序的具体过程及响应各种消息,以助于深入领会、理解、应用MFC架构,从而编写更好的应用程序。

关键词: 虚函数; 窗口应用程序; 消息映射; 面向对象技术; MFC

中图分类号: TN711?34; TP391 文献标识码: A 文章编号: 1004?373X(2014)11?0151?04

Abstract: The program structure generated by Win32 Application in VC development environment is simple and clear. The generation process of MFC generated window application program is fairly complex. In order to analyze the specific process of the MFC generated window application program, the source code of MFC framework and its calling relationship is studied deeply. In combination with encapsulation, inheritance, polymorphism and compiling preprocessor mechanisms of C++ object?orien?ted technology, a simulation system was designed to simulate the specific process of MFC generated window application program, and deal with various messages. It can help programmers to further comprehend and apply MFC architecture to write better Window?based application program.

Keywords: virtual function; window application program; message mapping; object?oriented technology; MFC

0 引 言

C++是功能强大的计算机编程语言,Microsoft Visual C++(简称VC)是微软提供的基于C/C++的应用程序集成开发工具。VC拥有丰富的功能和大量的扩展库,利用它可以方便地编写各式各样的应用软件,是面向对象技术程序设计语言C++的极佳应用。典型的Win32窗口应用程序的创建过程简单,结构清晰,但开发效率不高。利用MFC类库和应用程序框架,能够方便地开发具有Windows标准界面的应用程序。虽然有很多资料介绍利用MFC开发各种应用程序,但对于MFC应用程序窗口具体创建过程的介绍则相对简单,程序员感觉MFC框架生成窗口的过程复杂,难以理解MFC的动态性、诊断性、持续性这三大特点,以及消息映射机制。基于这些因素,添加、处理各种消息更无所适从。本文详细探讨MFC的窗口生成过程,给出了窗口生成过程及响应、处理消息的模拟程序,以帮助理解MFC的窗口创建过程[1]。

1 Win32窗口程序与基于MFC的窗口应用

程序的基本结构

1.1 Win32窗口程序的基本结构

Win32窗口程序的执行入口是WinMain函数,其功能相当于C语言中的main函数。生成并执行一个典型的Win32窗口程序的结构如下:

int WINAPI WinMain (HINSTANCE hInstance,

HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){

定义窗口类对象; 注册窗口类对象; 创建窗口; 显示窗口;更新窗口; 启动消息循环;

其中WinMain函数体的功能相对固定,程序员所需做的主要工作是处理各种消息,即定义窗口WndPro函数的功能。生成并执行一个Win32窗口程序可通过VC的Win32 Application向导完成。可见Win32窗口程序的结构简单明了,修改方便,但随着问题越来越复杂、规模越来越大,系统开发与维护的困难也随之增加。VC集成开发环境提供的MFC框架为建立功能强大的Windows应用程序提供了方便。

1.2 基于MFC的窗口应用程序的基本结构

使用AppWizard开发一个基于MFC的项目名为MyFirstMFC的单文档窗口程序,其结构如图1所示。

运行该程序后,可生成图2所示的窗口应用程序。在项目工作区中各个类的功能如下:

CMyFirstMFCApp:应用程序类,负责程序的初始化和结束处理;

CMainFrame:主窗口类,负责主窗口的创建、显示以及消息派发;

CMyFirstMFCDoc:文档类,负责应用程序的数据存储、修改和管理;

CMyFirstMFCView:视图类,负责为数据的显示和修改提供人机界面。

生成一个基于MFC的应用程序的过程相对简单,但应用程序窗口的具体创建过程却显得晦涩难懂。困惑的是:没有编写任何代码,便得到可以编译运行的应用程序;在Win32 Application中看到的应用程序执行入口WinMain,在该程序中却不见踪影。本质上,Windows程序结构没有变化,程序的最底层仍然是WinMain主函数和窗口函数WndProc。下面详细分析并模拟MFC生成窗口应用程序的过程。

2 系统结构分析

MFC是基于面向对象的C++编程技术的开发平台,系统架构特别复杂,主要体现在:系统类的层次结构;动态性、诊断性、持续性这三大特点;采用消息映射表而不是面向对象中的虚函数来响应和处理消息。为了实现模拟MFC主框架窗口的生成过程,设计了几个关键类[2?6],类的层次结构如图3所示,各个类的功能见表1。

3 系统详细设计

该模拟系统中的各个类的详细设计如图4所示。其中,黑色实线标识了类的层次关系,黑色虚线标识了程序执行过程中的调用顺序。

实现该系统的关键代码如下:

在WinMain主调函数中,程序按照图4中虚线箭头所指方向顺序执行,其中,消息处理函数采用Win32 application 中的switch?case结构。程序实现了窗口的生成,位图的加载,各种消息的响应 [7?10]。例如,窗口程序接收“鼠标左键按下”消息后的运算结果如图5所示。

4 结 语

MFC框架生成窗口的过程是基于Win32 的窗口创建过程,是对Win32创建过程的面向对象技术的封装。尽管MFC架构相当复杂,本文模拟并实现了MFC的基于面向对象技术生成窗口的过程及消息响应。模拟程序对MFC的消息处理采用传统的switch?case结构,但实际的MFC的消息处理机制抛弃了传统的消息处理结构,也没有利用面向对象技术的虚函数机制,而是采用消息映射表模式,完成对消息的响应。MFC窗口创建过程的模拟程序对理解并灵活运用MFC编写各种应用软件有较好的参考作用。

参考文献

[1] 车忠志,孙雪雁.MFC应用程序基本框架分析[J].农业网络信息,2010(9):145?147.

[2] 孔垂柳.VC++中MFC框架技术探索[J].吉林建筑工程学院学报,2009(8):82?84.

[3] 梅章明,张秀山.基于MFC和OpenGL的喷泉模拟实现[J].微型机与应用,2012(17):41?43.

[4] 刘连喜,徐惠民.MFC框架中的设计模式分析[J].计算机应用与软件,2005(9):50?52.

[5] 徐璇,姜明新,黄静,等.基于MFC的工程软件界面设计[J].电子设计工程,2011(21):11?13.

[6] 范志先,孙殿柱,李延瑞,等.采用MFC开发用户交互界面的新方法[J].工程图学学报,2008(4):160?163.

[7] 谢裕敏,舒辉,陈建敏,等.MFC消息响应函数的逆向定位[J].计算机应用,2009(5):1393?1396.

[8] 夏俊杰,赵刚.基于MFC的代码编辑器设计方法[J].现代电子技术,2012,35(4):28?30.

[9] 刘玲,曹建秋,周建,等.基于编程切入点的MFC教学方法研究[J].西南师范大学学报:自然科学版,2010(4):115?119.

[10] 钱乐毅.基于MFC的矢量图形系统研究与实现[J].北京测绘,2012(1):1?4.

2 系统结构分析

MFC是基于面向对象的C++编程技术的开发平台,系统架构特别复杂,主要体现在:系统类的层次结构;动态性、诊断性、持续性这三大特点;采用消息映射表而不是面向对象中的虚函数来响应和处理消息。为了实现模拟MFC主框架窗口的生成过程,设计了几个关键类[2?6],类的层次结构如图3所示,各个类的功能见表1。

3 系统详细设计

该模拟系统中的各个类的详细设计如图4所示。其中,黑色实线标识了类的层次关系,黑色虚线标识了程序执行过程中的调用顺序。

实现该系统的关键代码如下:

在WinMain主调函数中,程序按照图4中虚线箭头所指方向顺序执行,其中,消息处理函数采用Win32 application 中的switch?case结构。程序实现了窗口的生成,位图的加载,各种消息的响应 [7?10]。例如,窗口程序接收“鼠标左键按下”消息后的运算结果如图5所示。

4 结 语

MFC框架生成窗口的过程是基于Win32 的窗口创建过程,是对Win32创建过程的面向对象技术的封装。尽管MFC架构相当复杂,本文模拟并实现了MFC的基于面向对象技术生成窗口的过程及消息响应。模拟程序对MFC的消息处理采用传统的switch?case结构,但实际的MFC的消息处理机制抛弃了传统的消息处理结构,也没有利用面向对象技术的虚函数机制,而是采用消息映射表模式,完成对消息的响应。MFC窗口创建过程的模拟程序对理解并灵活运用MFC编写各种应用软件有较好的参考作用。

参考文献

[1] 车忠志,孙雪雁.MFC应用程序基本框架分析[J].农业网络信息,2010(9):145?147.

[2] 孔垂柳.VC++中MFC框架技术探索[J].吉林建筑工程学院学报,2009(8):82?84.

[3] 梅章明,张秀山.基于MFC和OpenGL的喷泉模拟实现[J].微型机与应用,2012(17):41?43.

[4] 刘连喜,徐惠民.MFC框架中的设计模式分析[J].计算机应用与软件,2005(9):50?52.

[5] 徐璇,姜明新,黄静,等.基于MFC的工程软件界面设计[J].电子设计工程,2011(21):11?13.

[6] 范志先,孙殿柱,李延瑞,等.采用MFC开发用户交互界面的新方法[J].工程图学学报,2008(4):160?163.

[7] 谢裕敏,舒辉,陈建敏,等.MFC消息响应函数的逆向定位[J].计算机应用,2009(5):1393?1396.

[8] 夏俊杰,赵刚.基于MFC的代码编辑器设计方法[J].现代电子技术,2012,35(4):28?30.

[9] 刘玲,曹建秋,周建,等.基于编程切入点的MFC教学方法研究[J].西南师范大学学报:自然科学版,2010(4):115?119.

[10] 钱乐毅.基于MFC的矢量图形系统研究与实现[J].北京测绘,2012(1):1?4.

2 系统结构分析

MFC是基于面向对象的C++编程技术的开发平台,系统架构特别复杂,主要体现在:系统类的层次结构;动态性、诊断性、持续性这三大特点;采用消息映射表而不是面向对象中的虚函数来响应和处理消息。为了实现模拟MFC主框架窗口的生成过程,设计了几个关键类[2?6],类的层次结构如图3所示,各个类的功能见表1。

3 系统详细设计

该模拟系统中的各个类的详细设计如图4所示。其中,黑色实线标识了类的层次关系,黑色虚线标识了程序执行过程中的调用顺序。

实现该系统的关键代码如下:

在WinMain主调函数中,程序按照图4中虚线箭头所指方向顺序执行,其中,消息处理函数采用Win32 application 中的switch?case结构。程序实现了窗口的生成,位图的加载,各种消息的响应 [7?10]。例如,窗口程序接收“鼠标左键按下”消息后的运算结果如图5所示。

4 结 语

MFC框架生成窗口的过程是基于Win32 的窗口创建过程,是对Win32创建过程的面向对象技术的封装。尽管MFC架构相当复杂,本文模拟并实现了MFC的基于面向对象技术生成窗口的过程及消息响应。模拟程序对MFC的消息处理采用传统的switch?case结构,但实际的MFC的消息处理机制抛弃了传统的消息处理结构,也没有利用面向对象技术的虚函数机制,而是采用消息映射表模式,完成对消息的响应。MFC窗口创建过程的模拟程序对理解并灵活运用MFC编写各种应用软件有较好的参考作用。

参考文献

[1] 车忠志,孙雪雁.MFC应用程序基本框架分析[J].农业网络信息,2010(9):145?147.

[2] 孔垂柳.VC++中MFC框架技术探索[J].吉林建筑工程学院学报,2009(8):82?84.

[3] 梅章明,张秀山.基于MFC和OpenGL的喷泉模拟实现[J].微型机与应用,2012(17):41?43.

[4] 刘连喜,徐惠民.MFC框架中的设计模式分析[J].计算机应用与软件,2005(9):50?52.

[5] 徐璇,姜明新,黄静,等.基于MFC的工程软件界面设计[J].电子设计工程,2011(21):11?13.

[6] 范志先,孙殿柱,李延瑞,等.采用MFC开发用户交互界面的新方法[J].工程图学学报,2008(4):160?163.

[7] 谢裕敏,舒辉,陈建敏,等.MFC消息响应函数的逆向定位[J].计算机应用,2009(5):1393?1396.

[8] 夏俊杰,赵刚.基于MFC的代码编辑器设计方法[J].现代电子技术,2012,35(4):28?30.

[9] 刘玲,曹建秋,周建,等.基于编程切入点的MFC教学方法研究[J].西南师范大学学报:自然科学版,2010(4):115?119.

[10] 钱乐毅.基于MFC的矢量图形系统研究与实现[J].北京测绘,2012(1):1?4.