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

📄 chap2_4.htm

📁 MFC开发基础教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
    <p>virtual void Dump(CDumpContext&amp; dc) const;</p>
    <p>// Implementation</p>
    <p>public:</p>
    <p>static const AFX_DATA CRuntimeClass classCObject;</p>
    <p>#ifdef _AFXDLL</p>
    <p>static CRuntimeClass* PASCAL _GetBaseClass();</p>
    <p>#endif</p>
    <p>};</p>
    <p>CObject</font><font SIZE="3">类为派生类提供了下述服务:</font><font FACE="Times New Roman" SIZE="3"></p>
    <blockquote>
      <font SIZE="3"><p></font><font SIZE="3">对象诊断</font></font><font FACE="Times New Roman" SIZE="3"><font FACE="Times New Roman" SIZE="3"></p>
      </font><p>MFC</font><font SIZE="3"><font SIZE="3">提供了许多诊断特性,它可以:</font><font FACE="Times New Roman" SIZE="3"></p>
      <p></font><font SIZE="3">输出对象内部信息:</font></font><font FACE="Times New Roman" SIZE="3">CDumpContext</font><font SIZE="3">类与</font><font FACE="Times New Roman" SIZE="3">CObject</font><font SIZE="3">的成员函数</font><font FACE="Times New Roman" SIZE="3">Dump</font><font SIZE="3"><font SIZE="3">配合,用于在调试程序时输出对象内部数据。</font><font FACE="Times New Roman" SIZE="3"></p>
      <p></font><font SIZE="3">对象有效性检查:重载基类的</font></font><font FACE="Times New Roman" SIZE="3">AssertValid</font><font SIZE="3"><font SIZE="3">成员函数,可以为派生类的对象提供有效性检查。</font><font FACE="Times New Roman" SIZE="3"></p>
      <p></font><font SIZE="3">运行时访问类的信息:</font><font FACE="Times New Roman" SIZE="3"></p>
      </font><p ALIGN="JUSTIFY">MFC<font SIZE="3">提供了一个非常有用的特性,它可以进行运行时的类型检查。如果从</font></font><font FACE="Times New Roman" SIZE="3">CObject</font><font SIZE="3">派生出一个类,并使用了以下三个宏</font><font FACE="Times New Roman" SIZE="3">(IMPLEMENT_DYNAMIC</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">I<font FACE="Arial" SIZE="2">MPLEMENT_ DYNCREATE</font></font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3">IMPLEMENT_SERIAL<font SIZE="3">)</font><font SIZE="3">之一,就可以:</font></font><font FACE="Times New Roman" SIZE="3"><font FACE="Times New Roman" SIZE="3"></p>
      <p></font></font><font SIZE="3"><font SIZE="3">运行时访问类名</font></font><font FACE="Times New Roman" SIZE="3"><font FACE="Times New Roman" SIZE="3"></p>
      <p></font></font><font SIZE="3"><font SIZE="3">安全可靠的把通用的</font></font><font FACE="Times New Roman" SIZE="3">CObject</font><font SIZE="3"><font SIZE="3">指针转化为派生类的指针</font><font FACE="Times New Roman" SIZE="3"></p>
      </font><p>比如,我们定义一个主窗口类<font FACE="Times New Roman" SIZE="3"></p>
      </font><p>CMyFrame:public CFrameWnd</p>
      <p>{</p>
      <p>......</p>
      <p>}</p>
      <p>然后我们使用这个类:<font FACE="Times New Roman" SIZE="3"></p>
      </font><p>CMyFrame *pFrame=(CMyFrame*)AfxGetMainWnd();</p>
      <p>pFrame-&gt;DoSomeOperation();</p>
      <p ALIGN="JUSTIFY">AfxGetMainWnd<font SIZE="3">是一个全局函数,返回指向应用程序的主窗口的指针,类型为</font></font><font FACE="Times New Roman" SIZE="3">CWnd*</font><font SIZE="3">,因此我们必须对它进行强制类型转换,但我们如何知道是否转换成功了呢?我们可以使用</font><font FACE="Times New Roman" SIZE="3">CObject</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">IsKindOf()</font><font SIZE="3">成员函数检查</font><font FACE="Times New Roman" SIZE="3">pFrame</font><font SIZE="3"><font SIZE="3">的类型,用法如下:</font><font FACE="Times New Roman" SIZE="3"></p>
      </font><p>ASSERT(pFrame-&gt;IsKindOf(RUN_TIMECLASS(CMyFrame)))<font SIZE="3">;</font><font FACE="Times New Roman" SIZE="3"></p>
      </font><p><font SIZE="3">将上一语句插入到</font></font><font FACE="Times New Roman" SIZE="3">pFrame-&gt; DoSomeOperation()</font><font SIZE="3">之前,就可以在运行时作类型检查,当类型检查失败时,引发一个断言</font><font FACE="Times New Roman" SIZE="3">(ASSERT)</font><font SIZE="3"><font SIZE="3">,中断程序执行。</font><font FACE="Times New Roman" SIZE="3"></p>
      <p></font><font SIZE="3">对象持续性</font><font FACE="Times New Roman" SIZE="3"></p>
      </font><p ALIGN="JUSTIFY"><font SIZE="3">通过与非</font></font><font FACE="Times New Roman" SIZE="3">CObject</font><font SIZE="3">派生的档案类</font><font FACE="Times New Roman" SIZE="3">CArchive</font><font SIZE="3">相结合,提供将多个不同对象以二进制形式保存到磁盘文件</font><font FACE="Times New Roman" SIZE="3">(Serilization)</font><font SIZE="3">中以及根据磁盘文件中的对象状态数据在内存中重建对象</font><font FACE="Times New Roman" SIZE="3">(Deserilization )</font><font SIZE="3"><font SIZE="3">的功能。</font><font FACE="Times New Roman" SIZE="3"></p>
      </font>
    </blockquote>
    <p><font SIZE="3">然而,</font></font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">不仅仅是一个类库,它还提供了一层建立在</font><font FACE="Times New Roman" SIZE="3">Windows API</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">C++</font><font SIZE="3">封装上的附加应用程序框架。该框架提供了</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">程序需要的多数公共用户界面。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">所谓应用程序框架指的是为了生成一般的应用所必须的各种软组件的集成。应用框架是类库的一种超集。一般的类库只是一种可以用来嵌入任何程序中的、提供某些特定功能(如图象处理、串行通信)的孤立的类的集合,但应用框架却定义了应用程序的结构,它的类既相互独立,又相互依赖,形成一个统一的整体,可以用来构造大多数应用程序。中国用户熟悉的</font><font FACE="Times New Roman" SIZE="3">Borland C++</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">DOS</font><font SIZE="3">下的</font><font FACE="Times New Roman" SIZE="3">Turbo Vision</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">下</font><font FACE="Times New Roman" SIZE="3">OWL(Object Windows Language)</font><font SIZE="3">都是应用框架的例子。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">下面我们举个具体的例子来说明</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">所提供的应用程序框架,程序如清单</font><font FACE="Times New Roman" SIZE="3">2.2</font><font SIZE="3"><font SIZE="3">。</font><b><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">清单</font></font><font FACE="Times New Roman" SIZE="3">2.2</font><font SIZE="3">应用程序框架示例</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p>#include&lt;afxwin.h&gt;</p>
    <p>//derived an application class</p>
    <p>class CMinMFCApp:public CWinApp</p>
    <p>{</p>
    <p>public:</p>
    <p>BOOL InitInstance();</p>
    <p>};</p>
    <p>//Derive the main window class</p>
    <p>class CMainWindow:public CFrameWnd</p>
    <p>{</p>
    <p>public:</p>
    <p>CMainWindow();</p>
    <p>DECLARE_MESSAGE_MAP()</p>
    <p>};</p>
    <p>BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)</p>
    <p>END_MESSAGE_MAP()</p>
    <p>/*CMinMFCApp Member Functions*/</p>
    <p>BOOL CMinMFCApp::InitInstance()</p>
    <p>{</p>
    <p>m_pMainWnd=new CMainWindow();</p>
    <p>m_pMainWnd-&gt;ShowWindow(m_nCmdShow);</p>
    <p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p>m_pMainWnd-&gt;UpdateWindow(); </p>
    <p>return TRUE;</p>
    <p>}</p>
    <p>/*CMainWindow member functions*/</p>
    <p>CMainWindow::CMainWindow()//constructor</p>
    <p>{</p>
    <p>Create(NULL,</p>
    <p>&quot;Min MFC Application&quot;,</p>
    <p>WS_OVERLAPPEDWINDOW,</p>
    <p>rectDefault,</p>
    <p>NULL,</p>
    <p>NULL);</p>
    <p>}</p>
    <p>/*an instance of type CMinMFCApp*/</p>
    <p>CMinMFCApp ThisApp;</p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">清单</font><font FACE="Times New Roman" SIZE="3">2.2</font><font SIZE="3">程序段定义了一个最小的</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">应用程序所需的框架程序。其中声明了</font><font FACE="Times New Roman" SIZE="3">CMinMFCApp</font><font SIZE="3">类,它是从应用程序类</font><font FACE="Times New Roman" SIZE="3">CWinApp</font><font SIZE="3">中派生下来的;和窗口</font><font FACE="Times New Roman" SIZE="3">CMainWindow</font><font SIZE="3">类,它是从框架窗口</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">类派生出来。我们还用</font><font FACE="Times New Roman" SIZE="3">CMinMFCApp</font><font SIZE="3">定义了一个全局对象</font><font FACE="Times New Roman" SIZE="3">ThisApp</font><font SIZE="3">。读者也许会问,为什么没有</font><font FACE="Times New Roman" SIZE="3">WinMain</font><font SIZE="3">函数?因为</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">已经把它封装起来了。在程序运行时,</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">应用程序首先调用由框架提供的标准的</font><font FACE="Times New Roman" SIZE="3">WinMain</font><font SIZE="3">函数。在</font><font FACE="Times New Roman" SIZE="3">WinMain</font><font SIZE="3">函数中,首先初始化由</font><font FACE="Times New Roman" SIZE="3">CMinMFCApp</font><font SIZE="3">定义的唯一的实例,然后调用</font><font FACE="Times New Roman" SIZE="3">CMinMFCApp</font><font SIZE="3">继承</font><font FACE="Times New Roman" SIZE="3">CWinApp</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">Run</font><font SIZE="3">成员函数,进入消息循环。退出时调用</font><font FACE="Times New Roman" SIZE="3">CWinApp</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">ExitInstance</font><font SIZE="3">函数。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">由上面的说明可以看到,应用程序框架不仅提供了构建应用程序所需要的类</font><font FACE="Times New Roman" SIZE="3">(CWinApp</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">等</font><font FACE="Times New Roman" SIZE="3">)</font><font SIZE="3">,还定义了程序的基本执行结构。所有的应用程序都在这个基本结构基础上完成不同的功能。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>MFC</font><font SIZE="3">除了定义程序执行结构之外,还定义了三种基本的主窗口模型:单文档窗口,多文档窗口和对话框作为主窗口。</font><font FACE="Times New Roman" SIZE="3"></p>

⌨️ 快捷键说明

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