11.3.2 MFC程序的组织方式(2)
3. 完成程序
为应用程序定义过窗口类之后,就可以编写COurApp类中的InitInstance()函数:
- BOOL COurApp::InitInstance(void)
- {
- m_pMainWnd = new COurWnd; // Construct a window object...
- m_pMainWnd->ShowWindow(m_nCmdShow); // ...and display it
- return TRUE;
- }
如前所述,该函数重写了基类CWinApp中定义的虚函数,虚函数由MFC库自动提供的WinMain()函数调用。InitInstance()函数通过使用new操作符在空闲存储器中为应用程序构造了一个主窗口对象。将返回的地址存入m_pMainWnd变量中,该变量是COurApp类中从基类继承的成员。这么做的结果是使该窗口对象附属于应用程序对象。我们甚至不需要考虑为创建的对象释放内存的问题-- 任何必要的清理工作都由MFC提供的WinMain()函数负责。
对于虽然相当有限、但也是完整的程序而言,还需要定义应用程序对象。在执行WinMain()之前,应用程序类COurApp的某个实例必须存在,因此必须使用下面这条语句在全局作用域声明该实例:
- COurApp AnApplication; // Define an application object
该对象之所以需要存在于全局作用域,是因为它是应用程序,而应用程序需要在开始执行之前存在。MFC提供的WinMain()函数要调用应用程序对象的InitInstance()函数成员来构造窗口对象,这表示应用程序对象是存在的。
4. 最终产品
既然我们已经看过所有代码,现在就可以在该项目的Ex11_02.cpp源文件中添加它们。在Windows程序中,类通常是在.h文件中定义的,而不在类内部定义的成员函数是在.cpp文件中定义的。但我们的应用程序是如此之短,因此最好把所有代码都放入一个.cpp文件中。这么做的优点是可以同时查看全部代码。该程序的代码如下所示:
- // Ex11_02.cpp An elementary MFC program
- #include <afxwin.h> // For the class library
- // Application class definition
- class COurApp:public CWinApp
- {
- public:
- virtual BOOL InitInstance() override;
- };
- // Window class definition
- class COurWnd:public CFrameWnd
- {
- public:
- // Constructor
- COurWnd()
- {
- Create(NULL, _T("Our Dumb MFC Application"));
- }
- };
- // Function to create an instance of the main application window
- BOOL COurApp::InitInstance(void)
- {
- m_pMainWnd = new COurWnd; // Construct a window object...
- m_pMainWnd->ShowWindow(m_nCmdShow); // ...and display it
- return TRUE;
- }
- // Application object definition at global scope
- COurApp AnApplication; // Define an application object
这就是我们需要执行的全部操作。该程序看起来有点儿奇特,因为没有WinMain()函数;但正如上面提到的那样,事实上有一个由MFC库提供的WinMain()函数。
示例说明
我们现在即将大功告成,接下来构建并运行该应用程序。选择Build | Build Ex11_02.exe菜单项,单击适当的工具栏按钮,或者仅仅按下Ctrl+Shift+B组合键,都可以编译该解决方案。最后应该进行完全的编译和链接,这样就可以按下Ctrl+F5组合键运行该程序。这个最简单的MFC程序如图11-5所示。
可以拖动边框调整该窗口的大小,可以四处移动整个窗口,或者以通常的方式将其最小化或最大化。该程序支持的其他功能只有"关闭";可以使用系统菜单,使用窗口右上角的关闭按钮,或者只是按下Alt+F4组合键来关闭程序。该程序看起来好像没有多少东西,但考虑到只有很少的几行代码,它还是给我们留下了十分深刻的印象。
