当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 接触VC之三:MFC基于对话框程序

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 接触VC之三:MFC基于对话框程序


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 131 ::
收藏到网摘: n/a

接触VC之三:MFC基于对话框程序
作者:释雪

下载本文示例工程(VC.Net版本)

最近,本人赶时髦,装上了一套Visual Studio.net,安装要2213M呢,硬盘上三个盘符总共剩下不足2G的地方了。不过,界面相当的漂亮,且功能强大,值得心慰。我终于可以在类视图上,尽情去看类的基类,以及基类的实现代码了。不仅如此,最好的是那附带的MSDN上所有的VC基础文章都是中文,翻译的比希望出版社的好得没的说。什么文档啊,框加窗口啊,多视图啊,应有尽有。所以建议大家都来用.net的吧,注意是要那七张盘的,三张的是beta版,VC功能不全的。

这部分该说一说MFC的具体程序了。因为我用的是.net,所以代码可能会与6.0的略有不同,但也无关紧要,不会妨碍整体结构。我也会小心代码兼容性的。

好了,拿起手边的VC吧。跟我一块来看一个基于对话框程序的所有代码吧。
如果是6.0的朋友则首先在菜单上选择新建,在工程(Project)选项卡中选中MFC AppWizard,将工程名(Project name)中起名为Dialog,按确定(OK)。在向导第一步中选择基于对话框(Dialog based),直接按完成(Finish)就可以了。
如果是.net的朋友则在菜单上选择新建->项目,在项目类型中选择Visual C++项目,在模板中选择MFC应用程序,在名称中输入Dialog,按确定。在应用程序类型中选择基于对话框,后按完成。
于是一个基于对话框程序就做好了。第一次使用MFC的朋友,一定会为之喳舌。自己从零开始编程许久了,也许还不习惯别人为咱们生成代码吧。“第一映象就是乱”,这就是我的同学给我的回答。没关系,我们可以一点一点来看和理解VC给我们生成的代码。毕竟,它为我们节省了很多时间来打WindowSDK框架代码。

请打开类视图(ClassView),如果无误的话,我们可以看到三个类。分别是CAboutDlg, CDialogApp, CDialogDlg这三个类。 其中,CDialogApp是最重要的一个类。双击CDialogApp,打开其定义体。我们会看到它是这么定义的:

class CDialogApp : public CWinApp
我们可以看到这个类是派生于CWinApp的。在MFC编程中,这种情况很多见,继承类库类来添加自己需要的功能,然后再去使用。在MFC应用程序中,CWinApp就是这样使用的。查一查类库关于CWinApp的描述,是这样的:

MFC中的主应用程序类封装用于 Windows 操作系统的应用程序的初始化、运行和终止。基于框架生成的应用程序必须有且仅有一个从 CWinApp 派生的类的对象。在创建窗口之前先构造该对象。

CWinApp 是从 CWinThread 派生的,后者表示可能具有一个或多个线程的应用程序的主执行线程。在最新版本的 MFC 中,InitInstance、Run、ExitInstance 和 OnIdle 成员函数实际位于 CWinThread 类中。此处将这些函数作为 CWinApp 成员来探讨,因为探讨所关心的是对象作为应用程序对象而不是主线程的角色。

与用于 Windows 操作系统的任何程序一样,框架应用程序也具有 WinMain 函数。但在框架应用程序中不必编写 WinMain。它由类库提供,并在应用程序启动时调用。WinMain 执行注册窗口类等标准服务。然后它调用应用程序对象的成员函数来初始化和运行应用程序。(可通过重写由 WinMain 调用的 CWinApp 成员函数来自定义 WinMain。)

为初始化应用程序,WinMain 调用应用程序对象的 InitApplication 和 InitInstance 成员函数。为运行应用程序的消息循环,WinMain 调用 Run 成员函数。在终止时,WinMain 调用应用程序对象的 ExitInstance 成员函数。


上面这段里指的框架应用程序,包括了我们这种对话框应用程序。如MSDN所说,MFC类库已经为我们提供了WinMain函数,而不必我们添加。这就是为什么在MFC程序看不见主函数的原故。请看这句话“基于框架生成的应用程序必须有且仅有一个从 CWinApp 派生的类的对象。在创建窗口之前先构造该对象。” 打开类视图的全局(Glotbals),会发现有一个theApp全局变量(或对象,我总觉得变量与对象可以归为一类,应该有一个统一的名称来讲)。双击它,就可以看到CDialogApp theApp这样的定义。因为全局变量和对象在程序中是最先被创建的,于是保证了在创建窗口之前构造一个CWinApp对象(因为CDialogApp派生于CWinApp,所以theApp也是一个CWinApp对象)。这个全局对象是非常有用,因为CWinApp本身集成了所有的程序资源WinAPI,我们可以使用它来取得程序的资源(如图标,图像,预定义字符串等等)。一般要取得此全局对象,不直接使用theApp,而是调用::AfxGetApp()来取得这个全局对象的指针。

MFC默认的主函数,会先调用theApp