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

📄 chap3_7.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
字号:
<html>

<head>
<title>3.7 更新命令用户接口(UI)消息</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>

<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>

<table border="0" width="615" cellspacing="0" cellpadding="0">
  <tr>
    </b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
      <tr>
        <td width="377" bgcolor="#15397D" height="20"></td>
        <td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual 
        C++网络教程</font></a></span></td>
      </tr>
    </table>
    </center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">3.7 </font><font color="#3973DE"><font SIZE="3">更新命令用户接口(</font><font FACE="Times New Roman" SIZE="3">UI</font><font SIZE="3">)消息</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">一般情况下,菜单项和工具条按钮都不止一种状态,我们经常需要根据应用的内部状态来对菜单项和工具条按钮作相应的改变。例如,在我们没有选择任何内容时,编辑菜单下的“复制”、“剪切”等菜单是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。比如,在</font><font FACE="Times New Roman" SIZE="3">Word</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">SDK</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">ClassWizard</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">Message Map</font><font SIZE="3">页中,如果我们选择一个菜单</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">,在</font><font FACE="Times New Roman" SIZE="3">Messages</font><font SIZE="3">列表框中就会出现两项:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>COMMAND</p>
    <p>UPDATE_COMMAND_UI</p>
    <p></font><font SIZE="3">其中</font><font FACE="Times New Roman" SIZE="3">UPDATE_COMMAND_UI</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">3.7.1</font><font SIZE="3" color="#3973DE">用户接口更新原理</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">为了理解用户接口更新机制,我们来看一下应用框架是如何实现用户接口更新的。当我们选择</font><font FACE="Times New Roman" SIZE="3">Edit</font><font SIZE="3">菜单时,将产生一条</font><font FACE="Times New Roman" SIZE="3">WM_INITMENUPOPUP</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">ON_UPDATE_COMMAND_UI</font><font SIZE="3">),并调用相应的更新处理器函数,就可以更新任何菜单项。比如,</font><font FACE="Times New Roman" SIZE="3">Edit</font><font SIZE="3">菜单下有</font><font FACE="Times New Roman" SIZE="3">Undo</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">Cut</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">Copy</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">Paste</font><font SIZE="3">等四个菜单项,就要发送四条用户接口更新命令。如果菜单项的命令</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">有一个更新处理器,它就会被调用进行更新;如果不存在,则框架检查该命令</font><font FACE="Times New Roman" SIZE="3">ID</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">ON_UPDATE_COMMAND_UI</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">File</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">Edit</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"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">3.7.2 </font><font SIZE="3" color="#3973DE">用户接口更新机制编程</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">当框架给处理函数发送更新命令时,它给处理函数传递一个指向</font><font FACE="Times New Roman" SIZE="3">CCmdUI</font><font SIZE="3">对象的指针。这个对象包含了相应的菜单项或工具条按钮的指针。更新处理函数利用该指针调用菜单项或工具条的命令接口函数来更新用户接口对象(包括灰化,使,使能,选中菜单项和工具条按钮等)。下面我们使用前面的例子演示如何使用用户接口更新机制:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>1.</font><font SIZE="3">按</font><font FACE="Times New Roman" SIZE="3">Ctrl+W</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">Message Map</font><font SIZE="3">选项页。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">2.</font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">Object 
    IDs</font><font SIZE="3">列表中选择 </font><font FACE="Times New Roman" SIZE="3">ID_SELECT_RED</font><font SIZE="3">,在</font><font FACE="Times New Roman" SIZE="3">Messages</font><font SIZE="3">列表中双击</font><font FACE="Times New Roman" SIZE="3">ON_UPDATE _COMMAND_UI</font><font SIZE="3">条目,弹出</font><font FACE="Times New Roman" SIZE="3">Add Member Function</font><font SIZE="3">对话框,缺省函数名为</font><font FACE="Times New Roman" SIZE="3">OnUpdateSelect Red</font><font SIZE="3">,按</font><font FACE="Times New Roman" SIZE="3">OK</font><font SIZE="3">按钮接收此函数名。</font><font FACE="Times New Roman" SIZE="3">OnUpdateSelectRed</font><font SIZE="3">成员函数名就出现在</font><font FACE="Times New Roman" SIZE="3">Member Functions</font><font SIZE="3">列表中。依次给</font><font FACE="Times New Roman" SIZE="3">ID_SELECT_BLUE</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">ID_SELECT_YELLOW</font><font SIZE="3">增加</font><font FACE="Times New Roman" SIZE="3">OnUpdateSelectBlue</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">OnUpdateSelectYellow</font><font SIZE="3">命令接口更新成员函数。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>3.</font><font SIZE="3">现在手工编辑刚才生成的成员函数,修改后形式如清单</font><font FACE="Times New Roman" SIZE="3">3.5</font><font SIZE="3">所示:<b></p>
    <p>清单</font><font FACE="Times New Roman" SIZE="3">3.5</b></p>
    <p>void CMainFrame::OnUpdateSelectBlue(CCmdUI* pCmdUI) </p>
    <p>{</p>
    <p>// TODO: Add your command update UI handler code here</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p>pCmdUI-&gt;SetCheck(m_nColor==BLUE);</b></p>
    <p>}</p>
    <p>void CMainFrame::OnUpdateSelectRed(CCmdUI* pCmdUI) </p>
    <p>{</p>
    <p>// TODO: Add your command update UI handler code here</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p>pCmdUI-&gt;SetCheck(m_nColor==RED);</b></p>
    <p>}</p>
    <p>void CMainFrame::OnUpdateSelectYellow(CCmdUI* pCmdUI) </p>
    <p>{</p>
    <p>// TODO: Add your command update UI handler code here</p>
    <p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p>pCmdUI-&gt;SetCheck(m_nColor==YELLOW);</b></p>
    <p>}</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">Hello</font><font SIZE="3">程序。当我们打开</font><font FACE="Times New Roman" SIZE="3">Test</font><font SIZE="3">菜单时,如图</font><font FACE="Times New Roman" SIZE="3">3-14</font><font SIZE="3">所示,在</font><font FACE="Times New Roman" SIZE="3">Red</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">RED</font><font SIZE="3">。如果选择</font><font FACE="Times New Roman" SIZE="3">Blue</font><font SIZE="3">,下次打开</font><font FACE="Times New Roman" SIZE="3">Test</font><font SIZE="3">菜单时,在</font><font FACE="Times New Roman" SIZE="3">Blue</font><font SIZE="3">菜单前就会有一个对号,而</font><font FACE="Times New Roman" SIZE="3">Red</font><font SIZE="3">前面的对号则没有了。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p align="center"></font><img src="T3_14.gif" alt="T3_14.tif (268858 bytes)" WIDTH="403" HEIGHT="267"><font FACE="Times New Roman" SIZE="3"></p>
    <p align="center"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">3-14</p>
    <p></font><font SIZE="3">类似的,要根据某个状态开关菜单,也可以为菜单生成命令接口更新成员函数。比如,在</font><font FACE="Times New Roman" SIZE="3">Edit</font><font SIZE="3">菜单中,如果当前剪贴板没有内容,</font><font FACE="Times New Roman" SIZE="3">Paste(</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>void CMainFrame::OnUpdateEditPaste(CCmdUI* pCmdUI)</p>
    <p>{</p>
    <p>pCmdUI-&gt;Enable(!IsClipboardEmpty());</p>
    <p>}</p>
    <p></font><font SIZE="3">其中</font><font FACE="Times New Roman" SIZE="3">IsClipboardEmtpy()</font><font SIZE="3">是读者自己编写的函数,用于判断剪贴板中是否有内容</font><font FACE="Times New Roman" SIZE="4"><b></p>
    </b></font><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
      <tr>
        <td><a href="chap3_6.htm">上一页</a></td>
        <td><p align="right"><a href="chap3_8.htm">下一页</a></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>

<p ALIGN="CENTER"></b><font SIZE="5"> </font><font FACE="Times New Roman" SIZE="5"></p>
</font><font FACE="Times New Roman" SIZE="3">

<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
</font></b>

<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>

<p></font> </p>
</body>
</html>

⌨️ 快捷键说明

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