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

📄 chap04.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 5 页
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">下面我们再来分析一下头文件</FONT><FONT SIZE=3>DialogDemo.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>// DialogDemo.h : 应用程序 DIALOGDEMO 的主要头文件</P>
<P>//</P>

<P>#if !defined(AFX_DIALOGDEMO_H__7ABABF88_0C8C_11D2_BC21_0000B4810A31__INCLUDED_)</P>
<P>#define AFX_DIALOGDEMO_H__7ABABF88_0C8C_11D2_BC21_0000B4810A31__INCLUDED_</P>

<P>#if _MSC_VER &gt;= 1000</P>
<P>#pragma once</P>
<P>#endif // _MSC_VER &gt;= 1000</P>

<P>#ifndef __AFXWIN_H__</P>
<P>&#9;#error include 'stdafx.h' before including this file for PCH</P>
<P>#endif</P>

<P>#include "resource.h"&#9;&#9;// 主要符号</P>

<P>/////////////////////////////////////////////////////////////////////////////</P>
<P>// CDialogDemoApp:</P>
<P>// 在 DialogDemo.cpp 中包括了该类的实现</P>
<P>//</P>

<P>class CDialogDemoApp : public CWinApp</P>
<P>{</P>
<P>public:</P>
<P>&#9;CDialogDemoApp();</P>

<P>// 重载</P>
<P>&#9;// ClassWizard 生成的虚函数重载</P>
<P>&#9;//{{AFX_VIRTUAL(CDialogDemoApp)</P>
<P>&#9;public:</P>
<P>&#9;virtual BOOL InitInstance();</P>
<P>&#9;//}}AFX_VIRTUAL</P>

<P>// 实现</P>

<P>&#9;//{{AFX_MSG(CDialogDemoApp)</P>
<P>&#9;&#9;// 注意 - ClassWizard 将在这里添加或删除成员函数</P>
<P>&#9;&#9;//    不要编辑你在这里所看到的这些生成代码块!</P>
<P>&#9;//}}AFX_MSG</P>
<P>&#9;DECLARE_MESSAGE_MAP()</P>
<P>};</P>

<P> </P>
<P>/////////////////////////////////////////////////////////////////////////////</P>

<P>//{{AFX_INSERT_LOCATION}}</P>
<P>// Microsoft Developer Studio 将在紧接着上一行之前的地方插入附加的声明。</P>

<P>#endif // !defined(AFX_DIALOGDEMO_H__7ABABF88_0C8C_11D2_BC21_0000B4810A31__INCLUDED_)</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">在头文件</FONT><FONT SIZE=3>DialogDemo.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义了应用程序类</FONT><FONT SIZE=3>CDialogDemoApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,应用程序类封装了一个</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的初始化、运行和终止。每一个</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序都必须包括一个从</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生的应用程序类,在应用程序</FONT><FONT SIZE=3>DialogDemo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,这个类就是</FONT><FONT SIZE=3>CDialogDemoApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。这个对象在窗口被创建之前进行构造。类</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>从类</FONT><FONT SIZE=3>CWinThread</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生,它代表了应用程序的主执行线程,正如我们在前面的章节中所讲述的那样,一个应用程序可以有多个执行线程。在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的最近看到版本中,已为类</FONT><FONT SIZE=3>CWinThread</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员函数</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>Run</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>ExitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>OnIdle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供了默认的实现。由于我们在讨论</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时更侧重于它作为应用程序对象所扮演的角色,而不是作为主线程,因此,我们在讨论前面提到的四个成员函数的时候,可以把它们想象为在类</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>定义的成员函数,即立足于应用程序对象的角度来看待和分析它们的行为,而不是立足于一个单独的线程的角度。</P>
<P ALIGN="JUSTIFY">应用程序类构成了应用程序的主执行线程。使用</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数可以创建新的执行线程。这些线程仍可以使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>库,详细的信息请参考本书关于进程和线程的有关章节。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">同其它的任何</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用一样,框架应用程序仍然具有一个</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数。但是,在由</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>生成的应用程序框架中,我们却找不到对</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的声明或定义。在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数是由类库提供的,它在应用程序启动时被调用。</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数执行如注册窗口类之类的标准服务。接着,它调用应用程序对象的成员函数来初始化并且运行应用程序。通过重载</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数所调用的类</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员函数可以自定义</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数通过调用应用程序对象的</FONT><FONT SIZE=3>InitApplication</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数来初始化应用程序,通过调用</FONT><FONT SIZE=3>Run</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数运行应用程序的消息循环,最后在程序结束时调用程序程序的</FONT><FONT SIZE=3>ExitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。其中</FONT><FONT SIZE=3>Run</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数一般由</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供,而</FONT><FONT SIZE=3>InitApplication</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>ExitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一般需要程序员创建或进行重载。</P>

<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>由于在</FONT><FONT SIZE=3>Win32</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>环境下,每一个应用程序的实例都是独立的,它们有着自己的虚拟地址空间,因此,在目前版本的</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中,成员函数</FONT><FONT SIZE=3>CWinApp::InitApplication</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>已被废弃,原来在</FONT><FONT SIZE=3>InitApplication</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中进行的初始化操作应该移到</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中进行。</LI></P></UL>

</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">由</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>生成的基于对话框的框架应用程序提供了对</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的默认重载,也正是在该成员函数中提供了基于对话框的应用程序的特点。在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,无论是基于对话框的应用程序,还是基于文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的应用程序,它们的应用程序对象都是从</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生而来的,它们之间的功能的巨大差异,往往就是通过对类</FONT><FONT SIZE=3>CWinApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员函数进行不同的重载来体现的。</P>
<P ALIGN="JUSTIFY">在每一个同一应用程序的实例被启动时,</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数调用一次</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。原有的</FONT><FONT SIZE=3>InitApplication</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不再有意义,每一个应用程序的实例都被认为是独立的,对应用程序的初始化同对实例的初始化没有本质区别。对于</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数,我们这时只需知道它在当应用程序进行初始化的时候由</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数调用。关于基于对话框的应用程序的</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数的典型实现,我们将在本章后面的内容中专门讲述。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">类</FONT><FONT SIZE=3>CDialogDemoApp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的实现包含在文件</FONT><FONT SIZE=3>DialogDemo.cpp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,其清单如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>// DialogDemo.cpp : 为应用程序定义类的行为</P>
<P>//</P>

<P>#include "stdafx.h"</P>
<P>#include "DialogDemo.h"</P>
<P>#include "DialogDemoDlg.h"</P>

<P>#ifdef _DEBUG</P>
<P>#define new DEBUG_NEW</P>
<P>#undef THIS_FILE</P>
<P>static char THIS_FILE[] = __FILE__;</P>
<P>#endif</P>

<P>/////////////////////////////////////////////////////////////////////////////</P>
<P>// CDialogDemoApp</P>

<P>BEGIN_MESSAGE_MAP(CDialogDemoApp, CWinApp)</P>
<P>&#9;//{{AFX_MSG_MAP(CDialogDemoApp)</P>
<P>&#9;&#9;// 注意 - ClassWizard 将在此添加或删除映射宏。</P>
<P>&#9;&#9;//    不要删除你在这里看到的这些生成代码块!</P>
<P>&#9;//}}AFX_MSG</P>
<P>&#9;ON_COMMAND(ID_HELP, CWinApp::OnHelp)</P>
<P>END_MESSAGE_MAP()</P>

<P>/////////////////////////////////////////////////////////////////////////////</P>
<P>// CDialogDemoApp 构造</P>

⌨️ 快捷键说明

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