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

📄 chap2_4.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
📖 第 1 页 / 共 5 页
字号:
    <p ALIGN="JUSTIFY">Visual C++</font><font SIZE="3">提供了两个重要的工具,用于支持应用程序框架,它们就是前面提到</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">用于在应用程序框架基础上迅速生成用户的应用程序基本结构。</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">用于维护这种应用程序结构。</font><font FACE="Times New Roman" SIZE="3"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">2.4.3 MFC</font><font SIZE="3" color="#3973DE">的优点</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>Microsoft MFC</font><font SIZE="3"><font SIZE="3">具有以下不同于其它类库的优势:</font><font FACE="Times New Roman" SIZE="3"></p>
    <blockquote>
      <p></font><font SIZE="3">完全支持</font></font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">所有的函数、控件、消息、</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">基本图形函数,菜单及对话框。类的设计以及同</font><font FACE="Times New Roman" SIZE="3">API</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">Windows API</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">switch/case</font><font SIZE="3">语句,所有消息映射到类的成员函数,这种直接消息到方法的映射对所有的消息都适用。它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表</font><font FACE="Times New Roman" SIZE="3">(V</font><font SIZE="3">表</font><font FACE="Times New Roman" SIZE="3">)</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>
      <p></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"></p>
      <p></font><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">40k</font><font SIZE="3">的目标代码,效率只比传统的</font><font FACE="Times New Roman" SIZE="3">C Windows</font><font SIZE="3">程序低</font><font FACE="Times New Roman" SIZE="3">5%</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">MFC</font><font SIZE="3">紧密结合的</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">等工具快速开发出功能强大的应用程序。</font><font FACE="Times New Roman" SIZE="3"></p>
    </blockquote>
    <p></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"></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">MFC</font><font SIZE="3">消息处理程序的基础。</font><font FACE="Times New Roman" SIZE="3"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">2.4.4 MFC</font><font SIZE="3" color="#3973DE">对消息的管理</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>Windows</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">SendMessage</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">PostMessage</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">SendDlgItemMessage</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">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">Switch/Case</font><font SIZE="3">分支,简化了</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">编程,使程序可读性、可维护性大大提高。</font><b><font FACE="Times New Roman" SIZE="3"></p>
    <p>MFC</font><font SIZE="3">对消息的处理</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p>MFC</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">switch/case</font><font SIZE="3">语句,而采用一种消息映射机制来决定如何处理特定的消息。这种消息映射机制包括一组宏,用于标识消息处理函数、映射类成员函数和对应的消息等。其中,用</font><font FACE="Times New Roman" SIZE="3">afx_msg</font><font SIZE="3">放在函数返回类型前面,用以标记它是一个消息处理成员函数。类若至少包含了一个消息处理函数,那么还需要加上一个</font><font FACE="Times New Roman" SIZE="3">DECLARE_MESSAGE_MAP()</font><font SIZE="3">宏,该宏对程序执行部分所定义的消息映射进行初始化。清单</font><font FACE="Times New Roman" SIZE="3">2.3</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.3 </font><font SIZE="3">消息处理函数例子</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p>class CMainFrame:CFrameWnd{</p>
    <p>public:</p>
    <p>CMainFrame();</p>
    <p>protected:</p>
    <p>//{{AFX_MSG(CMainFrame)</p>
    <p>afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</p>
    <p>afx_msg void OnEditCopy();</p>
    <p>afx_msg void OnClose();</p>
    <p>//}}AFX_MSG</p>
    <p>DECLARE_MESSAGE_MAP()</p>
    <p>};</p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">成员函数</font><font FACE="Times New Roman" SIZE="3">OnCreate,OnEditCopy,OnClose</font><font SIZE="3">分别用来处理消息</font><font FACE="Times New Roman" SIZE="3">WM_CREATE</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">ID_EDIT_COPY</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">WM_CLOSE</font><font SIZE="3">。其中,</font><font FACE="Times New Roman" SIZE="3">WM_CREATE</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">WM_CLOSE</font><font SIZE="3">是系统预定义消息,包含在</font><font FACE="Times New Roman" SIZE="3">Windows.h</font><font SIZE="3">中。而</font><font FACE="Times New Roman" SIZE="3">ID_EDIT_COPY</font><font SIZE="3">是菜单</font><font FACE="Times New Roman" SIZE="3">Edit-&gt;Copy</font><font SIZE="3">的标识,也就是用户选择</font><font FACE="Times New Roman" SIZE="3">Edit-&gt;Copy</font><font SIZE="3">菜单项时产生的消息,一般在资源文件头文件中定义。在类的实现部分给出这三个成员函数的定义,以及特殊的消息映射宏。上面的例子的消息映射宏定义如下:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)</p>
    <p>ON_WM_CREATE()</p>
    <p>ON_COMMAND(ID_EDIT_COPY, OnEditCopy)</p>
    <p>ON_WM_CLOSE()</p>
    <p>END_MESSAGE_MAP()</p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">消息映射宏由</font><font FACE="Times New Roman" SIZE="3">BEGIN_MESSAGE_MAP</font><font SIZE="3">() 和</font><font FACE="Times New Roman" SIZE="3">END_MESSAGE_MAP()</font><font SIZE="3">。其中,</font><font FACE="Times New Roman" SIZE="3">BEGIN_MESSAGE_MAP</font><font SIZE="3">宏包含两个参数</font><font FACE="Times New Roman" SIZE="3">CMainFrame</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">BEGIN_MESSAGE_MAP</font><font SIZE="3">()和</font><font FACE="Times New Roman" SIZE="3">END_MESSAGE_MAP()</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">ON_ WM_CREATE</font><font SIZE="3">被用来指定缺省的成员函数</font><font FACE="Times New Roman" SIZE="3">OnCreate</font><font SIZE="3">与</font><font FACE="Times New Roman" SIZE="3">WM_CREATE</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">WM_XXXX</font><font SIZE="3">消息相对应。如</font><font FACE="Times New Roman" SIZE="3">ON_WM_CLOSE</font><font SIZE="3">宏指定了</font><font FACE="Times New Roman" SIZE="3">WM_CLOSE</font><font SIZE="3">消息的处理成员函数为</font><font FACE="Times New Roman" SIZE="3">OnClose</font><font SIZE="3">。这时侯,只需要写出要处理的消息就够了,不必再写出处理函数。消息映射宏</font><font FACE="Times New Roman" SIZE="3">ON_COMMAND</font><font SIZE="3">则被用来将菜单项和用户自定义的命令同它们的处理成员函数联系起来。在上例中,用户选择</font><font FACE="Times New Roman" SIZE="3">Edit-&gt;Copy</font><font SIZE="3">菜单项时,系统执行</font><font FACE="Times New Roman" SIZE="3">OnEditCopy()</font><font SIZE="3">函数。</font><font FACE="Times New Roman" SIZE="3">ON_COMMAND</font><font SIZE="3">宏的一般定义形式如下:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>ON_COMMAND(command,command_function)</p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">其中,</font><font FACE="Times New Roman" SIZE="3">command</font><font SIZE="3">为菜单消息或用户自定义消息,</font><font FACE="Times New Roman" SIZE="3">command_function</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">WM_USER</font><font SIZE="3">和第一个消息值相对应,用户必须为自己的消息定义相对于</font><font FACE="Times New Roman" SIZE="3">WM_USER</font><font SIZE="3">的偏移值,偏移范围在</font><font FACE="Times New Roman" SIZE="3">0~0x3FFF</font><font SIZE="3">之间,这对绝大多数程序来说都是够用的。用户可以利用</font><font FACE="Times New Roman" SIZE="3">#define</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"></p>
    <p>#define WM_USER1 (WM_USER+0)</p>
    <p>#define WM_USER2 (WM_USER+1)</p>
    <p>#define WM_USER3 (WM_USER+2)</p>
    <p></font><font SIZE="3">下表列出了</font><font FACE="Times New Roman" SIZE="3">Windows95</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>
    <table BORDER="1" CELLSPACING="2" BORDERCOLOR="#7f7f7f" CELLPADDING="1" WIDTH="400">
      <tr>
        <td WIDTH="19%"></font><font SIZE="3"><font SIZE="3">常 量</font></font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="13%"><font SIZE="3">值</font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="26%"><font SIZE="3">消息值范围</font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="41%"><font SIZE="3">意 义</font><font FACE="Times New Roman" SIZE="3"></font></td>
      </tr>
      <tr>
        <td WIDTH="19%">WM_USER</td>
        <td WIDTH="13%">0x0400</td>
        <td WIDTH="26%">0x0000-0x03FF</td>
        <td WIDTH="41%">Windows<font SIZE="3">消息</font><font FACE="Times New Roman" SIZE="3"></font></td>
      </tr>
      <tr>
        <td WIDTH="19%"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="13%"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="26%">0x0400-0x7FFF</td>
        <td WIDTH="41%"><font SIZE="3">用户自定义的消息</font><font FACE="Times New Roman" SIZE="3"></font></td>
      </tr>
      <tr>
        <td WIDTH="19%"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="13%"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="26%">0x8000-0xBFFF</td>
        <td WIDTH="41%">Windows<font SIZE="3">保留值</font><font FACE="Times New Roman" SIZE="3"></font></td>
      </tr>
      <tr>
        <td WIDTH="19%"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="13%"><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></font></td>
        <td WIDTH="26%">0xC000-0xFFFF</td>
        <td WIDTH="41%"><font SIZE="3">供应用使用的字符串消息</font><font FACE="Times New Roman" SIZE="3"></font></td>
      </tr>

⌨️ 快捷键说明

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