频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

MFC基于对话框程序

来源: 作者: 出处:巧巧读书 2007-12-14 进入讨论组
上一页 1 2 3 4 5 6 下一页 

  与用于 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对象的InitApplication和InitInstance成员函数,来进行程序的初始化,在程序中一般只重写InitInstance函数。然后,建立一个消息循环,不同的是在循环不停地调用theApp的Run成员函数。当收到WM_QUIT后,退出while循环。最后,执行theApp的ExitInstance成员函数,从而结束整个应用程序。

  让我们在类视图(Class View)中展开CDialogApp类(点击那个+符号),我们可以看到CDialogApp重写了InitInstance()函数。它用于对应用程序主线程进行初始化。双击视图中的InitInstance()来查看此函数的定义。我这里的函数定义如下:

  000:BOOL CDialogApp::InitInstance()
001:{
002: // 如果一个运行在 Windows XP 上的应用程序代码指定要
003: // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
004: //则需要 InitCommonControls()。否则,将无法创建窗口。
005: InitCommonControls();
006:
007: CWinApp::InitInstance(); //调用父类的InitInstance来进行默认的初始化
008:
009: AfxEnableControlContainer();
010:
011:
012: CDialogDlg dlg; //建立一个对话框对象,CDialogDlg是我们自定义的对话框类
013: m_pMainWnd = &dlg; //将本线程(即程序主线程)的主窗口设置为这个对话框
014: INT_PTR nResponse = dlg.DoModal(); //有模式地显示这个对话框,直到对话框关闭
015: if (nResponse == IDOK) //如果对话框是用确定来关闭的,则
016: {
017: // TODO:在此放置处理用“确定”来关闭
018: //对话框的代码
019: }
020: else if (nResponse == IDCANCEL) //如果对话框是用取消来关闭的,则
021: {
022: // TODO:在此放置处理用“取消”来关闭
023: //对话框的代码
024: }
025:
026: // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
027: // 而不是启动应用程序的消息泵。
028: return FALSE;
029:}

  因为InitInstance()函数的结束返回值是false,应用程序将会立即退出。也就是只显示对话框,当对话框关闭后,程序就会结束了。这时候的InitInstance函数就有点主函数的味道了。

转 载:http://www.qqread.com/vc/z351710.html进入讨论组讨论。
上一页 1 2 3 4 5 6 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章