VC基于菜单与工具栏的程序创建_第1页
VC基于菜单与工具栏的程序创建_第2页
VC基于菜单与工具栏的程序创建_第3页
VC基于菜单与工具栏的程序创建_第4页
VC基于菜单与工具栏的程序创建_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、菜单l 菜单是重要的用户界面对象,用户通常从菜单栏中选择命令来使用应用程序。l windows98支持三种类型的菜单:(1)菜单栏(主菜单):菜单栏横放在窗口的顶部(2)弹出式子菜单:弹出式菜单是从主菜单下弹出的菜单(3)上下文菜单:通过鼠标右键弹出的自由浮动菜单1.菜单的机制与功能菜单可以用多种方法创建,一般存在在资源脚本中资源脚本中,在程序运行时才调入在程序运行时才调入,就像其他资源一样。1.1菜单消息菜单消息 菜单被选中时发送消息给windows,再由windows传送给应用程序的消息映像。 win32api提供4个菜单消息,但在mfc消息映像中,只有两个菜单消息wm_command和o

2、n_update_command_ui。mfc自动处理其他两个消息。(1)处理wm_command消息用户选中了菜单项会产生wm_command消息mfc的框架窗口类要确保每一个菜单项都有wm_command消息的处理函数,对缺少处理函数的菜单项,mfc使其变灰。消息映射on_command项采用以下形式: on_command(menuid,classmethod) menuid是菜单项的标识符,classmethod是处理菜单项wm_command消息定义的方法(命令处命令处理函数理函数)。(2)处理update_command_ui消息 在许多情况下菜单项可能有多个状态。例如某一个时刻可

3、用(正常),而某一个时刻不可用(菜单变灰);菜单项可以加注标记,以表明被选中或未被选中。 update_command_ui是mfc所特有的,如果想根据应用程序的当前状态激活或者使菜单项无效,或者在程序运行的某一刻反映菜单项的可用性,就要由自己处理这条消息。此消息和win32 api的wm_initpopupmenu消息相对应。 on_update_command_ui项采用以下形式: on_update_command_ui(menuid,classmethod) menuid是菜单项的标识符,classmethod是处理菜单update_command_ui消息定义的方法(更新处理函数更新

4、处理函数) 该消息值适合弹出式菜单项的菜单项,而对于顶层菜单项则不适用。例如不能使用该消息来禁止“文件”菜单项。 如果菜单项有更新处理函数更新处理函数,那么它被调用进行更新;如果没有,那么框架检查命令处理函数命令处理函数是否存在,若不存在,则使菜单变灰。 必须提供一个菜单处理函数菜单处理函数或更新函数更新函数。1.2 基于菜单栏的程序设计基于菜单栏的程序设计1 menuitem程序为一个单文档单文档的应用程序,程序启动后,单击“graph”菜单中的“rectangle”,则在当前的客户区中显示一个矩形;单击“graph”菜单中的“ellipse”,则在当前的客户区中显示一个椭圆。 (1)利用a

5、ppwizard,生成一个mfc的单文档工程“menuitem”。(2)单击“workspace”窗口的“resourceview”标签,找到“menu”项,双击“id_mainframe”,对菜单资源进行编辑。 用右键单击菜单项最右边的虚线框,在弹出式菜单中选择“propertis”命令,在“menu item properties”窗体中在“caption”一栏中输入“graph”用同样方法,设计其下的两个菜单项:第一个子菜单项,“id”为“id_graph_rec”,“caption”为“rectangle”。第二个子菜单项,“id”为“id_graph_ellipse”,“captio

6、n”为“ellipse”。(3)在“cmenuitemview”类中加入一些数据成员: public: bool m_rectangle; bool m_ellipse; colorref m_crbk;(4)编辑“menuitemview.cpp”文件中的构造函数,初始化数据成员,加入下面代码:cmenuitemview:cmenuitemview() m_rectangle =true; m_ellipse =false; m_crbk=rgb(255,0,0);(5)利用classwizard为视图类加入命令消息控制函数及更新命令ui消息控制函数。(6)编辑“menuitemview.c

7、pp”文件里的菜单命令控制函数。 ongraphrec函数用m_crbk颜色来填充客户区矩形,并设置布尔型变量m_rectangle 、 m_ellipse的值。void cmenuitemview:ongraphrec () cclientdc dc(this); cpen newpen, *oldpen;newpen.createpen(ps_solid,2,rgb(255,255,0);oldpen=dc.selectobject(&newpen); cbrush* pnewbrush, * poldbrush;pnewbrush=new cbrush;pnewbrush-cre

8、atesolidbrush(m_crbk); poldbrush=dc.selectobject(pnewbrush);dc.rectangle(40,20,200,50);m_rectangle =false;m_ellipse =true;dc.selectobject(poldbrush);dc.selectobject(oldpen);delete pnewbrush;对应的更新命令ui控制函数onupdategraphrec根据变量m_rectangle的值来控制菜单的有效性状态,决定菜单项“rectangle ”什么时候有效。 void cmenuitemview:onupdate

9、graphrec(ccmdui*pcmdui)pcmdui-enable(m_rectangle);ongraphellipse函数用m_crbk颜色来填充客户区,并设置布尔型变量m_ellipse 、 m_rectangle的值。 void cmenuitemview:ongraphellipse () cclientdc dc(this);cpen newpen, *oldpen;newpen.createpen(ps_solid,2,rgb(255,255,0);oldpen=dc.selectobject(&newpen); cbrush* pnewbrush, * poldb

10、rush;pnewbrush=new cbrush;pnewbrush-createsolidbrush(m_crbk); poldbrush=dc.selectobject(pnewbrush);dc.ellipse(230,70,310,150); m_rectangle = true;m_ellipse =false; dc.selectobject(poldbrush);dc.selectobject(oldpen);delete pnewbrush; 对应的更新命令ui控制函数onupdategraphellipse ,根据变量m_ellipse的值来控制菜单的有效性状态,决定菜单项

11、“ellipse”什么时候有效void cmenuitemview:onupdategraphellipse (ccmdui*pcmdui)pcmdui-enable(m_ellipse);1.3菜单消息的处理路径菜单消息的处理路径l mfc中拥有菜单的框架窗口不必处理每一个菜单项的消息;相反,菜单消息可由拥有这个菜单命令资源的其他对象来处理。例如,ccmdtarget派生类对象(如窗口和视窗)以及应用对象(由cwinapp派生),对于支持文档/视窗架构的应用程序,文档对象和视窗对象也能处理菜单消息。l 尽管任何由尽管任何由ccmdtarget派生的类对象都能接受菜单消息,派生的类对象都能接受

12、菜单消息,但并不是所有这类对象都可以同时接收到菜单消息,菜单消但并不是所有这类对象都可以同时接收到菜单消息,菜单消息是按照一定的路径传送的,下表列出了当息是按照一定的路径传送的,下表列出了当mfc发送命令消发送命令消息给非文档息给非文档/视窗结构的应用,单文档应用以及多文档应用时,视窗结构的应用,单文档应用以及多文档应用时,查找消息映射表的次序。查找消息映射表的次序。查找消息映射表的次序程序类型程序类型搜索路径搜索路径sdisdi单文档单文档当前视图当前视图 当前文档当前文档 文档模板文档模板 主框架窗口主框架窗口 应用程序对象应用程序对象mdimdi多文档多文档当前视图当前视图 当前文档当前

13、文档 创建文档的文档模板创建文档的文档模板 活活动的子框架窗口动的子框架窗口 主框架窗口主框架窗口 应用程序对象应用程序对象对话框对话框当前对话框当前对话框 对话框的父窗口对话框的父窗口 应用程应用程序对象序对象 应用程序收到一个菜单命令时,它按照一定的顺序传递该命令,该顺序依次为:视窗类、文档类、主框架类和应用类。首先是视窗类获得处理该命令的机会,然后是文档类,再接着是主框架类,最后是应用类。如果某个类没有相应的菜单命令,则该命令返回给上一个类处理,直到返回到应用类。如果其中有一个类处理了该命令,则直接返回系统,其他类就没有机会再处理了。1.4 弹出式菜单弹出式菜单 浮动的弹出式菜单是一种新

14、的用户界面设计风格。用户按下鼠标右键,然后就会弹出一个浮动菜单。 用资源编辑器和mfc库的cmenu:trackpopupmenu函数可以创建弹出式菜单,该函数的原型:bool trackpopupmenu(unit nflags,int x,int y, cwnd*pwnd, lpcrect lprct=null); 其中参数nflags为弹出式菜单的标志,例如若其值为tpm_rightalign,表示创建的弹出式浮动菜单,其右边界位于x处;若其值为tpm_leftalign,表示其左边界位于x处,参数x与y表示屏幕坐标。(1)浮动菜单的创建)浮动菜单的创建创建菜单对象需要两步。第一步,分配

15、一个c+对象;第二部,初始化该对象。下面为创建并初始化一个cmenu类对象的典型代码:/为浮动菜单申请一个对象空间cmenu pcontexmenu;/初始化 cmenu对象pcontexmenu.loadmenu(idr_menu1); (2)浮动菜单的显示 浮动菜单创建和初始化后,在用户单击了鼠标右键时显示。下面的wm_rbuttondown消息处理函数就可以显示出上面例子中的浮动菜单。void mymainframe:onrbuttondown(unit nflags,cpoint point)/首先将客户区坐标转换成屏幕坐标 clienttoscreen(&point);/在鼠

16、标的位置显示浮动菜单 cmenu* pmenu=pcontexmenu-getsubmenu(0); pmenu- trackpopupmenu ( tpm_leftalign|tpm_rightbutton,point.x,point.y,this);/调用缺省的处理函数cframewnd:onrbuttondown(nflags,point);1.5弹出式菜单设计按照如下步骤创建弹出式菜单。(1)选择“insert/resource”菜单命令,将弹出“insert resource”窗体,选中“menu”选项,然后单击“new”,将产生一个空的“id_menu1”菜单。(2)双击选择“id

17、r_mainframe”菜单,然后右键单击“graph”菜单项,在弹出式菜单中选择“copy”命令。(3)双击选择“id_menu1”菜单,右键单击第一个空的菜单,在弹出菜单中选择“paste”命令,将产生一个菜单项。(4)用classwizard在视图类中加入wm_rbuttondown消息控制函数,然后加入程序代码如下:void ctest1view:onrbuttondown (uint nflags, cpoint point)cmenu menu;menu.loadmenu(idr_menu1);clienttoscreen(&point); menu.getsubmenu(

18、0)-trackpopupmenu(tpm_leftalign|tpm_rightbutton,point.x,point.y,this); (5)编译运行程序,在运行的窗口中,右键单击,即可显示出弹出式菜单,并执行相应的命令。2. cmenu类2.1cmenu类简介l mfc是靠cmenu来管理菜单的。cmenu对象可以代表每个windows菜单,其中包括顶级菜单项以及与之相关联的弹出式菜单。l当窗口的create或loadframe函数被调用的时候,菜单的资源是直接附加到框架窗口的,cwnd成员函数getmenu返回一个临时cmenu指针。利用该指针,可以自由地访问和更新菜单对象。lid_

19、mainframe是标识资源脚本中的初始菜单。如果想在应用程序启动之后想要第二个菜单,可以使用菜单编辑器创建一个具有自己的资源id的菜单资源。然后在程序中构造一个cmenu对象,使用cwnd:loadmenu函数从这个资源中加载菜单,调用cwnd:setmenu函数将新菜单附加到框架窗口。然后调用detach成员函数来分离该对象的hmenu句柄,这样当cmenu对象超出范围的时候,菜单就不会被破坏了。 菜单对象实际上是由一个子菜单的嵌套结构组成的。可以使用getsubmenu成员函数来获得指向包含在主cmenu对象的弹出式菜单的指针。 cmenu:getmenustring函数返回对应于基于0

20、的索引或命令id的菜单项字符串。如果使用的是命令id选项,那么菜单连同任何子菜单一起被搜索。2.2动态改变菜单有时需要在运行时为响应程序状态的改变而频繁地动态增加或删除菜单项。在运行时为响应出现的状态而改变的菜单项称为动态菜单。动态菜单的好处是它给用户提供了一套适合于程序当前状态的选项列表。(1)获得菜单的指针获得菜单的指针 增加或删除一个菜单时,需要菜单的指针。为获得菜单的指针,应使用getmenu()函数。 cmenu* cwnd:getmenu()const 如果cwnd对象没有菜单,则返回值为null。如果cwnd对象是一个子窗口,则返回值是无意义的。该函数返回的指针是临时性的,不要把

21、它保存下来长期使用。 给出窗口的主菜单的指针后,就可以使用getsubmenu()函数来简单地获得包含在主菜单内的弹出式子菜单的指针。该函数的原型如下:cmenu*getsubmenu(int npos)const; 该函数用于获得一个弹出式菜单的cmenu对象的指针。 若指定位置有一个弹出式菜单,则返回一个指向cmenu对象的指针,该对象的m_hmenu成员包含弹出菜单的指针;否则返回null。若cmenu对象不存在,则生成一个模板,cmenu指针将被保留。在获得菜单的指针后,就可以为菜单添加或删除菜单项了。(2)给菜单中增加菜单项 为了在运行时给菜单增加菜单项,应当使用insertmenu

22、()函数,该函数的原型如下:bool insertmenu(uint nposition,unit nflags,unit nidnewitem=0,lpctstr lpsznewitem=null);bool insertmenu(unit nposition,nuit nflags,unit nidnewitem,const cbitmap*pbmp); 该函数用于向一个菜单中nposition指定的位置处插入一个菜单,并把其他项向后移。其应用程序可以用对nflags赋值的办法设置此菜单项的状态。 nidnewitem指定插入菜单项的id值。lpsznewitem指定菜单项的显示文本 只要

23、当窗口中的菜单发生了变化(无论窗口是否显示)时,就要调用cwnd:drawmenubar()函数。 第二种形式的insertmenu()函数的pbmp指定图形菜单项所用的位图。(3)删除菜单项 为了删除菜单项,应当使用deletemenu()函数,该函数原型如下所示: bool deletemenu(unit nposition,unit nflags); 若菜单项有一隶属弹出式菜单时,deletemenu将破坏该弹出式菜单,释放由此弹出菜单所占用的内存。 (4)获得菜单的菜单项数 在动态处理菜单时,需要频繁地知道一个菜单中有多少菜单项。为了获得菜单项的数目,应当使用如下的getmenuite

24、mcont()函数。 cmenu:getmenuitemcount uint getmenuitemcount()const该函数确定顶层或弹出式菜单项的项数。(5)使菜单项有效或无效 有时候,一些菜单项只适用于某些状态,而不适用于其他的状态。在这种情况下,需要使之暂时无效,之后再使其有效,为此可使用enablemenuitem()函数。cmenu:enablemenuitemunit enablemenuitem(unit nidenableitem,unit nenable);该函数可以设置菜单项,使菜单项可用、禁止或变灰。nidenableitem确定要改动的菜单项。该函数调用成功时,返

25、回先前的状态(mf_dissabled、mf_enable或mf_grayed),调用失败时返回-1。2.3动态菜单设计菜单既可以从资源模板中加载,也可以在程序中通过动态方式进行创建,本节将通过在graph菜单项下动态增加三个子菜单项,来改变显示区的背景颜色,具体方法如下:(1)选择菜单项“viewresource symbolsnew”,在“name”文本编辑框中输入“id_color1”,系统自动子在“value”框中加入一个值,单击“ok”,关闭“new symbol”。用同样方法,加入“id_color2,id_color3”的定义。(2)在在视图类中加入视图类中加入oninitial

26、update函数,函数,加入程序代码如下:cmenu*pcolormenu=null;cmenu*ptopmenu=afxgetmainwnd()- getmenu();int ipos;ipos=ptopmenu-getmenuitemcount()-1;pcolormenu=ptopmenu- getsubmenu(ipos);pcolormenu-appendmenu(mf_string,id_color1,“white”); pcolormenu-appendmenu(mf_string,id_color2,“purple”); pcolormenu-appendmenu(mf_str

27、ing,id_color3,“blue”);该程序代码首先获得指向框架窗口菜单的指针,然后获得指向graph菜单的指针,然后通过appendmenu()函数来增加3个菜单项。(3)用classwizard在视图中加入“oncmdmsg”,然后加入程序代码如下: bool ctest1view:oncmdmsg(uint nid,int ncode, void*pextra, afx_cmdhandlerinfo*phandlerinfo) if (phandlerinfo=null) if(nid=id_color1) if(ncode=cn_command) doselectcolor(0)

28、; else if(ncode=cn_update_command_ui) doupdateselectcolor(0,(ccmdui*)pextra); return true; else if(nid=id_color2) if(ncode=cn_command) doselectcolor(1); else if(ncode=cn_update_command_ui) doupdateselectcolor(1,(ccmdui*)pextra); return true; else if(nid=id_color3) if(ncode=cn_command) doselectcolor(

29、2); else if(ncode=cn_update_command_ui) doupdateselectcolor(2,(ccmdui*)pextra); return true;return cview:oncmdmsg(nid,ncod,pextra,phandlerinfo);该函数用于传递3个菜单命令的wm_command和update_command_ui消息到函数doselectcolor(i),doupdateselectcolor(i,(ccmdui*)pextra)。 (6)右键点 “cmenuitemview”类,在弹出的窗口里选择“add menmber functi

30、on”菜单项,在“add menmber function”窗口的“function type”框中输入“void”,在“function declaration”框中输入“doselectcolor(int icolor)”,其余接受缺省设置。用同样方式设置doupdateselectcolor(int icolor,ccmdui*pcmdui)函数。设置完成后,加入下面代码。void cmenuitemview: doselectcolor(int icolor)assert(icolor=0&icolor=0&icolorsetcheck(m_crbk=rgb(255,2

31、55,255);else if(icolor=1)pcmdui-setcheck(m_crbk=rgb(128,0,128); else if(icolor=2)pcmdui-setcheck(m_crbk=rgb(0,0,128); pcmdui-enable(true);该函数更新相应菜单项设置。(7)编译运行该应用程序,然后分别测试3个颜色菜单项是否满足要求。 工具栏 工具栏是一系列工具按钮的组合,借助它们可以提高用户的工作效率。 vc6.0系统保存了每个工具栏相应的位图,其中包括所有按钮的图像,它们具有相同的尺寸(高15像素,宽16像素),它们在位图中的排列次序与屏幕上按钮在工具栏上的

32、次序相同。1 使用工具栏编辑器 选择菜单选择菜单“文件文件”“打开工作区打开工作区”,将前面的单,将前面的单文档应用程序文档应用程序调入。在项目工作区窗口中选择调入。在项目工作区窗口中选择resourceview页面,双击页面,双击“toolbar”项中的项中的idr_mainframe则工具栏编辑器出现在主界面的右则工具栏编辑器出现在主界面的右边。边。 空按钮空按钮图形工图形工具箱具箱颜色工颜色工具箱具箱1 使用工具栏编辑器 1.1 创建一个新的工具栏按钮创建一个新的工具栏按钮 在新建的工具栏中,最右端总有一个空按钮,在新建的工具栏中,最右端总有一个空按钮,双击该双击该按钮弹出其属性对话框,

33、在按钮弹出其属性对话框,在id框中输入其标识符名称,框中输入其标识符名称,其右端又出现一个新的空按钮。其右端又出现一个新的空按钮。单击按钮,在资源编辑单击按钮,在资源编辑器的工具按钮设计窗口可以进行工具按钮的位图绘制。器的工具按钮设计窗口可以进行工具按钮的位图绘制。1.2 移动一个按钮移动一个按钮 在工具栏中移动一个按钮,用在工具栏中移动一个按钮,用鼠标左键点中鼠标左键点中它并拖动它并拖动至相应位置即可。至相应位置即可。如果用户拖动它离开如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失。若在移工具栏位置,则此按钮从工具栏中消失。若在移动一个按钮的同时,按下动一个按钮的同时,按下ctrl键,

34、则在新位置复键,则在新位置复制一个按钮,新位置可以是同一个工具栏中的其制一个按钮,新位置可以是同一个工具栏中的其他位置,也可在不同的工具栏中他位置,也可在不同的工具栏中。1 使用工具栏编辑器1.3 删除一个按钮删除一个按钮 将选取中的按钮拖离工具栏,则该按钮将选取中的按钮拖离工具栏,则该按钮就消失了。就消失了。但若选中按钮后,单击但若选中按钮后,单击delete键并不能删除一个按钮,只是将按钮中的键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。图形全部以背景色填充。 1 使用工具栏编辑器1.4. 在工具栏中插入空格在工具栏中插入空格 在工具栏中插入空格有以下几种情况:在工具栏中插入空

35、格有以下几种情况:l如果按扭前没有任何空格,如果按扭前没有任何空格,拖动该按钮向右移动并当覆拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现空格。空格。l如果按钮前有空格而按钮后没有空格,如果按钮前有空格而按钮后没有空格,拖动该按钮向左拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后将出现空格。则此按钮后将出现空格。l如果按钮前后均有空格,如果按钮前后均有空格,拖动该按钮向右移动并当接触拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保

36、留,按钮后的空格消到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面的空格保留。钮时,则此按钮前面的空格消失,后面的空格保留。1 使用工具栏编辑器 1.5. 工具栏按钮属性的设置工具栏按钮属性的设置双击某按钮弹出其属性对话框,如图所示。双击某按钮弹出其属性对话框,如图所示。项 目含 义id工具栏按钮的标识符,用户既可以输入自己的标识符名称,也可从id框的下拉列表中选取标识符名称宽(width)工具栏按钮的象素宽度高(height)工具栏按钮的象素高度提示(pro

37、mpt)工具栏按钮提示文本;若为“建立新文档n新建”,则表示将鼠标指向该按钮时,在状态栏中显示“建立新文档”,而在弹出的提示信息中出现“新建”字样。“n”是它们的分隔转义符2 工具按钮和菜单项相结合 工具按钮和菜单项相结合是指当选择工具按钮或菜单工具按钮和菜单项相结合是指当选择工具按钮或菜单命令时,操作结果是一样的。命令时,操作结果是一样的。 结合的方法:在工具按钮的属性对话框中将按钮的结合的方法:在工具按钮的属性对话框中将按钮的id号设置为相关联的菜单项号设置为相关联的菜单项id。例:在前面程序基础上,通过两个工具按钮分别显示主菜例:在前面程序基础上,通过两个工具按钮分别显示主菜单单idr_

38、mainframe和菜单和菜单idr_menu1。 (1) 打开前面的单文档应用程序。打开前面的单文档应用程序。 (2) 利用工具栏编辑器设计两个工具按钮。利用工具栏编辑器设计两个工具按钮。2 工具按钮和菜单项相结合 (3) 双击刚才设计的第一个工具按钮,弹出该工具按双击刚才设计的第一个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的钮的属性对话框,将该工具按钮的id号设为号设为id_test_return,在提示框内键入,在提示框内键入“返回应用程序返回应用程序主菜单主菜单n返回主菜单返回主菜单”。 (4) 双击刚才设计的第二个工具按钮,弹出该工具按双击刚才设计的第二个工具按钮,弹出该工

39、具按钮的属性对话框,将该工具按钮的钮的属性对话框,将该工具按钮的id号设为号设为id_vew_test,在提示框内键入,在提示框内键入“显示测试菜单显示测试菜单n显显示测试菜单示测试菜单”。2 工具按钮和菜单项相结合(5) 编译运行并测试。程序运行后,将鼠标移至刚才设编译运行并测试。程序运行后,将鼠标移至刚才设计的第一个工具按钮处,这时在状态栏上显示出计的第一个工具按钮处,这时在状态栏上显示出“返回返回应用程序主菜单应用程序主菜单”信息,若稍等片刻会弹出提示小窗口,信息,若稍等片刻会弹出提示小窗口,显示出显示出“返回主菜单返回主菜单”字样,单击新添加的这两个按钮,字样,单击新添加的这两个按钮,

40、会执行相应的菜单命令。会执行相应的菜单命令。3 多个工具栏的使用 在用在用mfc appwizard创建的文档应用程序中往往只有创建的文档应用程序中往往只有一个工具栏,但在实际应用中,常常需要多个工具栏。一个工具栏,但在实际应用中,常常需要多个工具栏。 例:在前面程序基础上,当显示主菜单例:在前面程序基础上,当显示主菜单idr_mainframe时,只显示时,只显示mfc appwizard创建的工创建的工具栏,当显示菜单具栏,当显示菜单idr_menu1时,则只显示新添加的工时,则只显示新添加的工具栏。具栏。 (1) 在项目工作区的在项目工作区的resourceview页面中,展开页面中,展

41、开toolbar(工具栏工具栏)资源,用鼠标单击资源,用鼠标单击idr_mainframe不松开,按下不松开,按下ctrl键,移动鼠标将键,移动鼠标将idr_mainframe拖拖到到toolbar资源名称上,复制了工具栏默认资源资源名称上,复制了工具栏默认资源idr_mainframe,复制后的资源标识系统自动设为,复制后的资源标识系统自动设为idr_mainframe1。3 多个工具栏的使用 (2) 右击工具栏资源右击工具栏资源idr_mainframe1,从弹出的快捷,从弹出的快捷菜单中选择菜单中选择properties命令,如图所示,将命令,如图所示,将id设为设为idr_toolba

42、r1。(3) 双击双击idr_toolbar1,打开工具栏资源,按图删除,打开工具栏资源,按图删除不要的工具按钮。不要的工具按钮。3 多个工具栏的使用(4) 在在cmainframe类中添加一个成员变量类中添加一个成员变量m_wndtestbar,变量类型为,变量类型为ctoolbar。ctoolbar类封类封装了工具栏的操作。装了工具栏的操作。 (5) 在在cmainframe:oncreate函数中添加工具栏创建代函数中添加工具栏创建代码:码: int cmainframe:oncreate(lpcreatestruct lpcreatestruct) if (cframewnd:oncr

43、eate(lpcreatestruct) = -1) return -1;3 多个工具栏的使用 int nres = m_wndtestbar.createex(this, tbstyle_flat, ws_child | ws_visible |cbrs_top | cbrs_gripper | cbrs_tooltips |cbrs_flyby|cbrs_size_dynamic,crect(0,0,0,0), afx_idw_toolbar + 10); if (!nres |!m_wndtestbar.loadtoolbar(idr_toolbar1)trace0(failed to

44、create toolbarn); return -1; / fail to create 3 多个工具栏的使用m_wndtoolbar.enabledocking(cbrs_align_any);m_wndtestbar.enabledocking(cbrs_align_any);enabledocking(cbrs_align_any); dockcontrolbar(&m_wndtoolbar); dockcontrolbar(&m_wndtestbar);return 0; enabledocking是是cwnd类成员函数,用来让工具栏类成员函数,用来让工具栏或其他控制

45、条在窗口进行停靠操作,参数或其他控制条在窗口进行停靠操作,参数cbrs_align_any表示可以停靠在窗口的任一边。表示可以停靠在窗口的任一边。 dockcontrolbar是是cframewnd类的成员函数,用来类的成员函数,用来将指定的工具栏或其他控制条进行停靠。将指定的工具栏或其他控制条进行停靠。3 多个工具栏的使用 createex是是ctoolbar类的成员函数,用来创建一个工具类的成员函数,用来创建一个工具栏对象。栏对象。 第第1个参数用来指定工具栏所在的父窗口指针,个参数用来指定工具栏所在的父窗口指针,this表示表示当前的当前的cmainframe类窗口指针。类窗口指针。 第

46、第2个参数用来指定工具按钮的风格,个参数用来指定工具按钮的风格,当为当为tbstyle_flat时表示工具按钮是时表示工具按钮是“平面的平面的”。 第第3个参数用来指定工具栏的风格,个参数用来指定工具栏的风格,由于这里的工具栏是由于这里的工具栏是cmainframe的子窗口,因此需要指定的子窗口,因此需要指定ws_child | ws_visible ; cbrs_top表示工具栏放置在父窗口的顶表示工具栏放置在父窗口的顶部;部; cbrs_gripper表示工具栏前面有一个表示工具栏前面有一个“把手把手” ; cbrs_tooltips 表示允许有工具提示;表示允许有工具提示;cbrs_ f

47、lyby表表示在状态栏显示工具提示文本;示在状态栏显示工具提示文本; cbrs_size_dynamic 表表示工具栏在浮动时,其大小是可以动态改变的。示工具栏在浮动时,其大小是可以动态改变的。3 多个工具栏的使用 第第4个参数是用来指定工具栏四周的边框大小,个参数是用来指定工具栏四周的边框大小,一般都一般都为为0。 最后一个参数用来指定工具栏这个子窗口的标识最后一个参数用来指定工具栏这个子窗口的标识id(与工与工具栏资源标识不同具栏资源标识不同)。 afx_idw_toolbar是系统内部是系统内部的工具栏子窗口标识,并将的工具栏子窗口标识,并将afx_idw_toolbar+1的值的值表示

48、默认的状态栏子窗口标识。如果在创建新的工具栏时表示默认的状态栏子窗口标识。如果在创建新的工具栏时没有指定相应的子窗口标识,则会使用默认的没有指定相应的子窗口标识,则会使用默认的afx_idw_toolbar。这样当打开。这样当打开“查看查看”菜单时,单菜单时,单击击“工具栏工具栏”菜单时,显示或隐藏的工具栏不是原来的工菜单时,显示或隐藏的工具栏不是原来的工具栏而是新添加的工具栏。因此需要重新指定工具栏子窗具栏而是新添加的工具栏。因此需要重新指定工具栏子窗口的标识,并使其值等于口的标识,并使其值等于afx_idw_toolbar + 10。3 多个工具栏的使用(6) 编译运行,结果如图所示编译运行,结果如图所示 (7) 本例希望本例希望idr_toolbar1工具栏

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论