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

📄 chap05.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<P ALIGN="CENTER"><CENTER><TABLE CELLSPACING=0 BORDER=0 CELLPADDING=7 WIDTH=461>
<TR><TD WIDTH="56%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><IMG SRC="Image210.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image210.gif" WIDTH=230 HEIGHT=287></FONT></TD>
<TD WIDTH="44%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><IMG SRC="Image211.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image211.gif" WIDTH=178 HEIGHT=124></FONT></TD>
</TR>
</TABLE>
</CENTER></P>

<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>5. 12 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>改变菜单项</FONT><FONT SIZE=1>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>值</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">现在,试着运行一下我们的程序,会发现它并没有能比最初的</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>建立的标准程序多做些什么。这是必然的,毕竟,我们还没有编写一行让它动起来的代码吗!不过不要紧,我们接下来所要做的,就是这项工作。(不用担心</FONT><FONT SIZE=3>IDR_MAINFRAME0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对</FONT><FONT SIZE=3>IDR_MAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的替代会有什么不良结果,实际上,</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>监测到这些,并已在程序代码中作了相应的变动以反应这一变化。)</P>
<P ALIGN="JUSTIFY">首先,由于对菜单的动态改变在菜单</FONT><FONT SIZE=3>IDR_MAINFRAME1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的菜单项中实现,因此,我们所要做的第一步工作就是实现菜单</FONT><FONT SIZE=3>IDR_MAINFRAME1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对菜单</FONT><FONT SIZE=3>IDR_MAINFRAME0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的动态替换。这可以用</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的一个成员函数</FONT><FONT SIZE=3>SetMenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现。函数</FONT><FONT SIZE=3>SetMenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的原型为:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>BOOL SetMenu(CMenu * pMenu);</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">其中</FONT><FONT SIZE=3>pMenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为一指向欲替换原有菜单的一</FONT><FONT SIZE=3>CMenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的对象的指针,函数的返回值仅仅在菜单没有发生改变时为</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>

<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P></UL>


<UL>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>如果你以空值</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>作为指向</FONT><FONT SIZE=3>CMenu</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的指针,那你的程序的菜单就算消失了。除非在程序中以适当方式告诉用户重新得到菜单的方法,用户很难再得到菜单了。不过,在一些情形下,实现菜单的消隐</FONT><FONT SIZE=3>/</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>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的成员函数的添加还是有自己的很大程度上的不同。在我们已经生成的程序中,添加对菜单消息的响应的函数是有一些自己的特殊性的。下面我们结合图示顺序讲解。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在菜单项上或源代码编辑区中右击鼠标,或选择</FONT><FONT SIZE=3>View/ClassWizard…</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单项,打开</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对话框。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>Class name:</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项中,确认为</FONT><FONT SIZE=3>CMainFrame</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Object IDs:</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中选择</FONT><FONT SIZE=3>ID_VIEW_LONGMENU,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>Message</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:选项中选择</FONT><FONT SIZE=3>COMMAND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,如图</FONT><FONT SIZE=3>5.13</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image212.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image212.gif" WIDTH=481 HEIGHT=315></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>5. 13 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>为菜单项增加消息响应函数</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image213.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image213.gif" WIDTH=249 HEIGHT=73></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>5. 14 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>选择响应函数名称</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>单击</FONT><FONT SIZE=3>Add Class…</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为响应函数命名(如图</FONT><FONT SIZE=3>5.14</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示),一般说,接受系统提供的缺省名就足可以了。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">4.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>单击</FONT><FONT SIZE=3>OK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>后进入源代码编辑区进行编辑。</P>
<P ALIGN="JUSTIFY">如下所示,为我们为函数</FONT><FONT SIZE=3>OnViewLongmenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所加的代码:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CMainFrame::OnViewLongmenu() </P>
<P>{</P>
<P>&#9;// TODO: Add your command handler code here</P>
<P>&#9;SetMenu(&amp;hLongMenu);</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">理解这段代码并不困难,但参数</FONT><FONT SIZE=3>hLongMenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>从何而来</FONT><FONT SIZE=3>?</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这是我们在程序中创建的一个标识菜单</FONT><FONT SIZE=3>IDR_MAINFRAME1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>CMenu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的一个对象。在文件</FONT><FONT SIZE=3>MainFrm.cpp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的下示函数中我们对其进行了初始化</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这两处代码均是手工加入的</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</P>
<P>{</P>
<P>  // ...</P>
<P>  hLongMenu.LoadMenu(IDR_MAINFRAME1); </P>
<P>  // ...</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">而其定义在头文件</FONT><FONT SIZE=3>MainFrm.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>class CMainFrame : public CFrameWnd</P>
<P>{</P>
<P>    // ...</P>
<P>    CMenu hLongMenu;</P>
<P>    // ...</P>
<P>}    </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">对</FONT><FONT SIZE=3>View</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单的前三个菜单项的响应涉及到</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>绘图的一些知识,读者如果暂时弄不清楚,可以留待看过相应章节后再回头来理解。下面我们看一看对菜单的动态操作。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image214.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image214.gif" WIDTH=302 HEIGHT=199></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>5. 15 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>在程序中增加位图资源</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在前面的第四章的那个例程中,我们对这类实现作了些简要的介绍,在这里,我们结合本章的程序作一些更深入的介绍。</P>
<P ALIGN="JUSTIFY">首先,对菜单的动态操作的几个函数,其最后一个参数都可以用一个位图指针替代。本章例程中</FONT><FONT SIZE=3>Draw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单下的图符菜单即由此实现。当然,要使用位图作为菜单项,首先必须创建位图资源。</P>
<P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单中选择</FONT><FONT SIZE=3>Insert/Resource…,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>再在弹出的对话框中选择</FONT><FONT SIZE=3>Bitmap</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,如图</FONT><FONT SIZE=3>5.15</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
<P ALIGN="JUSTIFY">如果有现成的位图,可以选择</FONT><FONT SIZE=3>Import…</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,当然,在很多情况下,我们可以选</FONT><FONT SIZE=3>New</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>直接在资源编辑器中对它们进行创建、编辑。位图编辑器的使用很容易掌握,在此不再赘述。图形可以参考前面的插图。下面的代码摘自</FONT><FONT SIZE=3>Menu.rc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,以便读者在指定位图属性时作参考。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>IDB_LINE               BITMAP  DISCARDABLE     "res\\line.bmp"</P>
<P>IDB_CIRCLE             BITMAP  DISCARDABLE     "res\\bitmap1.bmp"</P>
<P>IDB_RECTANGLE          BITMAP  DISCARDABLE     "res\\rectangl.bmp"</P>
<P>IDB_TEXT               BITMAP  DISCARDABLE     "res\\bmp00001.bmp"</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">同时,当然也应该注意映射的关系。只要与欲执行该功能的字符菜单项的</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>号一致,那么,它们所实现的功能就是一样的。下面的几行代码摘自</FONT><FONT SIZE=3>MainFrm.cpp</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CMainFrame::OnChange() </P>
<P>{</P>
<P>&#9;// TODO: Add your command handler code here</P>
<P>&#9;if(!bBitmap)</P>
<P>&#9;{</P>
<P>&#9;&#9;bBitmap=TRUE;</P>
<P>        CMenu *pMenu=GetMenu();</P>
<P>&#9;&#9;CMenu *pSubMenu=pMenu-&gt;GetSubMenu(3);</P>
<P>        pSubMenu-&gt;ModifyMenu(ID_DRAW_LINE,MF_BYCOMMAND,ID_DRAW_LINE,&amp;hLine);</P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_DRAW_CIRCLE,MF_BYCOMMAND,ID_DRAW_CIRCLE,&amp;hCircle);</P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_DRAW_RECTANGLE,</P>
<P>&#9;&#9;&#9;MF_BYCOMMAND,ID_DRAW_RECTANGLE,&amp;hRectangle);</P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_CHANGE,MF_BYCOMMAND,ID_CHANGE,&amp;hText);</P>
<P>&#9;}</P>
<P>&#9;else</P>
<P>&#9;{</P>
<P>&#9;&#9;bBitmap=FALSE;</P>
<P>        CMenu *pMenu=GetMenu();</P>
<P>&#9;&#9;CMenu *pSubMenu=pMenu-&gt;GetSubMenu(3);</P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_DRAW_LINE,MF_BYCOMMAND,ID_DRAW_LINE,"&amp;Line");</P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_DRAW_CIRCLE,MF_BYCOMMAND,ID_DRAW_CIRCLE,"&amp;Circle");</P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_DRAW_RECTANGLE,</P>
<P>&#9;&#9;&#9;MF_BYCOMMAND,ID_DRAW_RECTANGLE,"&amp;Rectangle");         </P>
<P>&#9;&#9;pSubMenu-&gt;ModifyMenu(ID_CHANGE,MF_BYCOMMAND,ID_CHANGE,"&amp;Bitmap");</P>
<P>&#9;}</P>
<P>} </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">而下面这段程序完成了位图资源的装入与初始化:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</P>
<P>{</P>
<P>   // ...</P>
<P>&#9;hLine.LoadBitmap(IDB_LINE);</P>
<P>&#9;hCircle.LoadBitmap(IDB_CIRCLE);</P>
<P>&#9;hRectangle.LoadBitmap(IDB_RECTANGLE);</P>
<P>&#9;hText.LoadBitmap(IDB_TEXT);</P>
<P>   // ...</P>
<P>}</P>
</FONT><FONT FACE="

⌨️ 快捷键说明

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