⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap3_4.htm

📁 vc教程,真正的程序员用Visual C++。如果你想当程序员
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxWinTerm();</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return nReturnCode;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  应用程序执行时,Windows自动调用应用程序框架内部的WinMain函数。如清单3-1所示,WinMain函数会查找该应用程序的一个全局构造对象,这个对象是由CWinApp派生类构造的,有且只有一个。它是一个全局对象,因此在程序启动时,它就已经被构造好了。<br>
      随后,WinMain将调用这个对象的InitApplication和InitInstance成员函数,完成应用程序实例的初<br>
    始化工作。随后,WinMain调用Run成员函数,运行应用程序的消息循环。在程序结束时,WinMain调用AfxWinTerm函数,做一些清理工作。</span></p>
    <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">3.4.2 
    应用程序类</font></span></p>
    <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt">  每个应用程序必须从CWinApp派生出自己的应用程序类,并定义一个全局的对象。该应用程序类包含了Windows下应用程序的初始化、运行和结束过程。基于框架建立的应用程序必须有一个(且只能有一个)从CWinApp派生的类的对象。在Hello程序中,我们从CWinApp中派生出一个CHelloApp类,并定义了一个全局对象theApp。CHelloApp类在hello.cpp中定义。<br>
      要访问应用程序类构造的对象,可以调用全局函数AfxGetApp()。AfxGetApp()返回一个指向全局对象的指针。可以通过对它进行强制类型转换,转换为我们派生的应用程序类。</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">比如:</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CHelloApp* pApp=(CHelloApp*)AfxGetApp();</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  在CHelloApp应用程序类中,我们还重载了CWinApp的成员函数InitInstance。InitInstance函数主要完成以下工作:设置注册数据库,载入标准设置(最近打开文件列表等)、注册文档模板。其中注册文档模板过程中隐含地创建了主窗口。接着,处理命令行参数,显示窗口,然后返回、进入消息循环。下面的程序清单3.2给出了Hello程序的InitInstance函数代码。</span></p>
    <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单3.2 InitInstance函数</span></b></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// CHelloApp initialization</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL CHelloApp::InitInstance()</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxEnableControlContainer();</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Standard initialization</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// If you are not using these features and 
    wish to reduce the size</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// of your final executable, you should 
    remove from the following</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// the specific initialization routines 
    you do not need.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">#ifdef _AFXDLL</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">Enable3dControls(); // Call this when 
    using MFC in a shared DLL</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">#else</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">Enable3dControlsStatic(); // Call this 
    when linking to MFC statically</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">#endif</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Change the registry key under which our 
    settings are stored.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// You should modify this string to be 
    something appropriate</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// such as the name of your company or 
    organization.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">SetRegistryKey(_T(&quot;Local 
    AppWizard-Generated Applications&quot;));</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">LoadStdProfileSettings(); // Load standard 
    INI file options (including MRU)</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Register the application's document 
    templates. Document templates</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// serve as the connection between 
    documents, frame windows and views.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CSingleDocTemplate* pDocTemplate;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">pDocTemplate = new CSingleDocTemplate(</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">IDR_MAINFRAME,</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">RUNTIME_CLASS(CHelloDoc),</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">RUNTIME_CLASS(CMainFrame), // main SDI 
    frame window</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">RUNTIME_CLASS(CHelloView));</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">AddDocTemplate(pDocTemplate);</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Parse command line for standard shell 
    commands, DDE, file open</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CCommandLineInfo cmdInfo;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ParseCommandLine(cmdInfo);</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Dispatch commands specified on the 
    command line</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!ProcessShellCommand(cmdInfo))</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return FALSE;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// The one and only window has been 
    initialized, so show and update it.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pMainWnd-&gt;ShowWindow(SW_SHOW);</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pMainWnd-&gt;UpdateWindow();</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return TRUE;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  在CWinApp的派生类中,必须重载InitInstance函数,因为CWinApp并不知道应用程序需要什么样的窗口,它可以多文档窗口、单文档窗口,也可以是基于对话框的。</span></p>
    <b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">Run成员函数<br>
      </b>WinMain在初始化应用程序实例后,就调用Run函数来处理消息循环。Run成员函数不断执行消息循环,检查消息队列中有没有消息。如果有消息,Run将其派遣,交由框架去处理,然后返回继续消息循环。如果没有消息,Run将调用OnIdle来做用户或框架可能需要在空闲时才做的工作,象后面我们讲到的用户接口更新消息处理等。如果既没有消息要处理,也没有空闲时的处理工作要做,则应用程序将一直等待,直到有事件发生。当应用程序结束时,Run将调用ExitInstance。消息循环的流程图如图3-10所示。</span><b></p>
    </b><p ALIGN="center"><span style="font-size: 9pt"><img src="T3_10.gif"
    alt="T3_10.tif (197232 bytes)" WIDTH="338" HEIGHT="436"></span></p>
    <p ALIGN="CENTER"><span style="font-size: 9pt">图3-10 Run成员函数的消息循环</span></p>
    <p ALIGN="CENTER"><b><span style="font-size: 9pt"> </span></p>
    <p><span style="font-size: 9pt">关闭应用程序</span></p>
    <p></b><span style="font-size: 9pt">&nbsp;&nbsp;&nbsp; 用户可以通过选择File-Exit菜单或点主窗口的关闭按钮,关闭主框架窗口,来终止应用程序。此时,应用程序类首先删除m_pMainWnd主框架窗口对象,然后退出Run函数,进而退出WinMain,在退出WinMain后删除TheApp对象。</span></p>
    <div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
      <tr>
        <td><span style="font-size: 9pt"><a href="chap3_3.htm">上一页</a></span></td>
        <td><p align="right"><span style="font-size: 9pt"><a href="chap3_5.htm">下一页</a></span></td>
      </tr>
    </table>
    </center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
    <p align="center"></font><font size="2" color="#000000">本教程由<a
    href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
    未经许可,请勿以任何形式复制</font></td>
    <b>
  </tr>
</table>
</center></div></b>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -