-84-
信 息 科 学
三维 GIS开发工具 VC- MFC 在
Windows应用程序中的封装
徐 磊
(浙江师范大学旅游与资源管理学院,浙江 金华 321004)
1概述
MFC是微软公司提供的一整套应用程序框
架,它利用C++语言全面封装了微软的Windows
API接口,在开发Windows应用程序的时候,该框
架自动完成了大量的界面设计,窗口设计,窗口创
建及初始化等重复性较高的工作。从一个MFC框
架下的单文档应用程序以及MFC类库源代码入
手,比较详细的剖析MFC的封装过程,以帮助增
进对这一过程的认识,并助益于后续的Windows
程序设计。
2 Test程序一览
2.1 几个重要C++类
Test程序中包含几个重要的类,应用程序类
CTestApp,框架窗口类 CMainFrame,视图类
CTestView,文档类 CTestDoc,对话框类 CAbout-
Dlg。其中 CTestApp 类代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
了应用程序本身,
CMainFrame类封装了程序中的框架窗口属性和
方法,CTestView类主要封装程序客户区视图窗口
以及数据在其上的显示和编辑,CTestDoc封装了
程序中的数据读写和管理,至于对话框类
CAboutDlg,则用于关于程序“关于对话框”的显
示。
2.2 Test程序大致运行
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
应用程序变量初始化 - >进入主
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
- >程
序初始化及配置 - >框架窗口的创建,注册窗口
类,文档类,图类的构造,窗口的显示和更新等。这
是程序的重中之重,也是本文重点讨论的部分。最
后完成消息循环。
3 应用程序的初始化
3.1 找到WinMain函数
习惯了Win32程序设计的人们对WinMain
函数再熟悉不过,它是任何一个Win32程序的入
口点,然而,不少人面对基于MFC设计的Win32
程序却产生了困惑,因为他们熟悉的WinMain函
数忽然不见了。WinMain消失了吗?当然不是,只
不过它被MFC这个庞大而复杂的应用程序框架
隐藏的很深,不易发现罢了。
打开源文件APPMODUL.CPP,在此文件中可以发
现这样的代码:
_tWinMain(……)
{
return AfxWinMain (hInstance, hPrevInstance, lpCmdLine,
nCmdShow);
}
和我们熟悉的WinMain非常相似,连参数都
一样,进一步追踪在头文件 TCHAR.H中找到宏定
义:#define _tWinMain WinMain。可知 _tWin-
Main函数其实就是我们熟悉的WinMain函数。
3.2 进行初始化配置
进入AfxWinMain函数,该函数主要代码如
下(源文件WINMAIN.CPP):
int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE
hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
. . . . . .
CWinThread* pThread = AfxGetThread();
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmd-
Show))
. . . . . .
if (!pThread- >InitInstance())
nReturnCode = pThread- >Run(); }
首先是如下两条语句:
3.2.1 CWinThread* pThread = AfxGetThread
();以及 CWinApp* pApp = AfxGetApp();他们都是
获取指向当前应用程序的指针。两个指针变量
pThread和 pApp此时指向同一变量 theApp。
3.2.2 AfxWinInit (…) 函数执行完毕回到
AfxWinMain函数中,随后调用 InitApplication函
数。追踪代码发现也是对 theApp对象内部的文档
管理类成员 m_pDocManager进行一些初始化操
作。
以上就是程序开始运行以来,所进行的一些
带有准备性质的初始化工作,这为整个基于MFC
的Win32程序打下了底层基础,但还远远不够,还
有框架窗口的创建,注册窗口类,窗口的显示和更
新等重要步骤尚未完成,而这些将在随后被
AfxWinMain函数调用的 CTestApp::InitInstance(. .
. )函数中实现。
4 程序框架的最终完成
4.1 进入CTestApp::InitInstance()函数
先前的 AfxWinMain函数在调用了 InitAp-
plication函数之后,有如下语句:
pThread- >InitInstance (),此时因为指针
pThread实际指向全局对象 theApp,所以这一语
句实际调用了 CTestApp::InitInstance(. . . )函数,
该函数主要代码如下:
BOOL CTestApp::InitInstance()
{
. . . . . .
CSingleDocTemplate * pDocTemplate;
pDocTemplate = new CSingleDocTemplate(…) //语句 1
AddDocTemplate(pDocTemplate); //语句 2
. . . . . .
if (!ProcessShellCommand(cmdInfo)) //语句 3
return FALSE;
m_pMainWnd- >ShowWindow(SW_SHOW); //语句 4
m_pMainWnd- >UpdateWindow(); //语句 5
return TRUE;
}
4.2 应用程序窗口的创建
在语句 1,2 完成文档
模板
个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载
创建后,InitIn-
stance函数调用了 ProcessShellCommand(…)函数。
我们可以跟踪运行程序,按 F11 键进入 Pro-
cessShellCommand函数内部,可以看到其中有如
下代码(参见MFC源文件APPUI2.CPP):
BOOL CWinApp::ProcessShellCommand (CCommandLineInfo&
rCmdInfo)
{
BOOL bResult = TRUE;
switch (rCmdInfo.m_nShellCommand)
{
case CCommandLineInfo::FileNew:
if (!AfxGetApp ()- >OnCmdMsg (ID_FILE_NEW, 0,
NULL, NULL))
OnFileNew();
}
ProcessShellCommand 函数将调用 AfxGe-
tApp ()- >OnCmdMsg (ID_FILE_NEW, 0, NULL,
NULL),实际上等价于对 ID_FILE_NEW命令消息
的响应(选择:文件 - >新建菜单项产生此消息),并
随即调用CWinApp::OnFileNew()函数。它又调用了
CWinApp类的成员,文档管理器对象的 CDoc-
Manager::OnFileNew()函数,跟踪运行会发现,在程
序的最底层中最终调用了Win32 API函数::Reg-
isterClass!水落石出了,可以看出MFC将Win32
API的注册窗口类操作隐藏的很深。
4.3 消息循环
程序继续运行,跟踪至CTestApp::InitInstance
函数的标记 4处,CTestApp::InitInstance函数至此
运行结束,退回到 AfxWinMain函数中,执行
pThread- >Run()语句,因为 CWinApp类未改写这
个虚函数,故实际执行CWinThread::Run()函数。
跟踪运行,在 CWinThread::Run()函数内部会
发现封装了两个Win32 API函数,一个是用来从
应用程序消息队列中抓取消息的::PeekMessage
(…),一个是将消息送到窗口函数处的
::PumpMessage()。Test程序将在二者间不停切
换,直到我们关闭程序,产生一个WM_QUIT消
息,程序才将彻底结束运行并退出。
5 结论
至此,笔者以一个基于MFC创建的单文档
Win32程序为例,向读者初步揭示了MFC封装过
程的庐山真面目,当我们去创建一个基于MFC框
架的Win32程序时,MFC框架将Win32程序设计
中一些常见的操作复杂而完美的封装了起来,将
烦琐而常见工作隐藏,让我们把精力用在更重要
的地方。三维GIS开发大多使用VC++与OpenGL
接口相结合的方式,而封装良好的MFC就是开发
的强大工具
参考文献
[1]Microsoft MSDN 在线帮助文档,2001
[2]孙鑫. VC++ 深入详解[M]. 北京: 电子工业出版
社, 20066,63-88.
摘 要:微软的MFC(Microsoft Foundation Class)是一套面向对象的应用程序框架,它封装了Win32 SDK中的 API接口。VC++ 及MFC是进
行三维 GIS开发的重要工具。以一个基于MFC的单文档应用程序为例,剖析MFC 的封装过程,重点是程序的初始化和窗口创建,显示,更新过程
中的封装细节,为读者揭示MFC的封装机制。
关键词:MFC;封装;Win32 API;应用程序框架