




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、菜單l 菜單是重要的用戶界面對象,用戶通常從菜單欄中選擇命令來使用應(yīng)用程序。l windows98支持三種類型的菜單:(1)菜單欄(主菜單):菜單欄橫放在窗口的頂部(2)彈出式子菜單:彈出式菜單是從主菜單下彈出的菜單(3)上下文菜單:通過鼠標(biāo)右鍵彈出的自由浮動(dòng)菜單1.菜單的機(jī)制與功能菜單可以用多種方法創(chuàng)建,一般存在在資源腳本中資源腳本中,在程序運(yùn)行時(shí)才調(diào)入在程序運(yùn)行時(shí)才調(diào)入,就像其他資源一樣。1.1菜單消息菜單消息 菜單被選中時(shí)發(fā)送消息給windows,再由windows傳送給應(yīng)用程序的消息映像。 win32api提供4個(gè)菜單消息,但在mfc消息映像中,只有兩個(gè)菜單消息wm_command和o
2、n_update_command_ui。mfc自動(dòng)處理其他兩個(gè)消息。(1)處理wm_command消息用戶選中了菜單項(xiàng)會(huì)產(chǎn)生wm_command消息mfc的框架窗口類要確保每一個(gè)菜單項(xiàng)都有wm_command消息的處理函數(shù),對缺少處理函數(shù)的菜單項(xiàng),mfc使其變灰。消息映射on_command項(xiàng)采用以下形式: on_command(menuid,classmethod) menuid是菜單項(xiàng)的標(biāo)識符,classmethod是處理菜單項(xiàng)wm_command消息定義的方法(命令處命令處理函數(shù)理函數(shù))。(2)處理update_command_ui消息 在許多情況下菜單項(xiàng)可能有多個(gè)狀態(tài)。例如某一個(gè)時(shí)刻可
3、用(正常),而某一個(gè)時(shí)刻不可用(菜單變灰);菜單項(xiàng)可以加注標(biāo)記,以表明被選中或未被選中。 update_command_ui是mfc所特有的,如果想根據(jù)應(yīng)用程序的當(dāng)前狀態(tài)激活或者使菜單項(xiàng)無效,或者在程序運(yùn)行的某一刻反映菜單項(xiàng)的可用性,就要由自己處理這條消息。此消息和win32 api的wm_initpopupmenu消息相對應(yīng)。 on_update_command_ui項(xiàng)采用以下形式: on_update_command_ui(menuid,classmethod) menuid是菜單項(xiàng)的標(biāo)識符,classmethod是處理菜單update_command_ui消息定義的方法(更新處理函數(shù)更新
4、處理函數(shù)) 該消息值適合彈出式菜單項(xiàng)的菜單項(xiàng),而對于頂層菜單項(xiàng)則不適用。例如不能使用該消息來禁止“文件”菜單項(xiàng)。 如果菜單項(xiàng)有更新處理函數(shù)更新處理函數(shù),那么它被調(diào)用進(jìn)行更新;如果沒有,那么框架檢查命令處理函數(shù)命令處理函數(shù)是否存在,若不存在,則使菜單變灰。 必須提供一個(gè)菜單處理函數(shù)菜單處理函數(shù)或更新函數(shù)更新函數(shù)。1.2 基于菜單欄的程序設(shè)計(jì)基于菜單欄的程序設(shè)計(jì)1 menuitem程序?yàn)橐粋€(gè)單文檔單文檔的應(yīng)用程序,程序啟動(dòng)后,單擊“graph”菜單中的“rectangle”,則在當(dāng)前的客戶區(qū)中顯示一個(gè)矩形;單擊“graph”菜單中的“ellipse”,則在當(dāng)前的客戶區(qū)中顯示一個(gè)橢圓。 (1)利用a
5、ppwizard,生成一個(gè)mfc的單文檔工程“menuitem”。(2)單擊“workspace”窗口的“resourceview”標(biāo)簽,找到“menu”項(xiàng),雙擊“id_mainframe”,對菜單資源進(jìn)行編輯。 用右鍵單擊菜單項(xiàng)最右邊的虛線框,在彈出式菜單中選擇“propertis”命令,在“menu item properties”窗體中在“caption”一欄中輸入“graph”用同樣方法,設(shè)計(jì)其下的兩個(gè)菜單項(xiàng):第一個(gè)子菜單項(xiàng),“id”為“id_graph_rec”,“caption”為“rectangle”。第二個(gè)子菜單項(xiàng),“id”為“id_graph_ellipse”,“captio
6、n”為“ellipse”。(3)在“cmenuitemview”類中加入一些數(shù)據(jù)成員: public: bool m_rectangle; bool m_ellipse; colorref m_crbk;(4)編輯“menuitemview.cpp”文件中的構(gòu)造函數(shù),初始化數(shù)據(jù)成員,加入下面代碼:cmenuitemview:cmenuitemview() m_rectangle =true; m_ellipse =false; m_crbk=rgb(255,0,0);(5)利用classwizard為視圖類加入命令消息控制函數(shù)及更新命令ui消息控制函數(shù)。(6)編輯“menuitemview.c
7、pp”文件里的菜單命令控制函數(shù)。 ongraphrec函數(shù)用m_crbk顏色來填充客戶區(qū)矩形,并設(shè)置布爾型變量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;對應(yīng)的更新命令ui控制函數(shù)onupdategraphrec根據(jù)變量m_rectangle的值來控制菜單的有效性狀態(tài),決定菜單項(xiàng)“rectangle ”什么時(shí)候有效。 void cmenuitemview:onupdate
9、graphrec(ccmdui*pcmdui)pcmdui-enable(m_rectangle);ongraphellipse函數(shù)用m_crbk顏色來填充客戶區(qū),并設(shè)置布爾型變量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; 對應(yīng)的更新命令ui控制函數(shù)onupdategraphellipse ,根據(jù)變量m_ellipse的值來控制菜單的有效性狀態(tài),決定菜單項(xiàng)
11、“ellipse”什么時(shí)候有效void cmenuitemview:onupdategraphellipse (ccmdui*pcmdui)pcmdui-enable(m_ellipse);1.3菜單消息的處理路徑菜單消息的處理路徑l mfc中擁有菜單的框架窗口不必處理每一個(gè)菜單項(xiàng)的消息;相反,菜單消息可由擁有這個(gè)菜單命令資源的其他對象來處理。例如,ccmdtarget派生類對象(如窗口和視窗)以及應(yīng)用對象(由cwinapp派生),對于支持文檔/視窗架構(gòu)的應(yīng)用程序,文檔對象和視窗對象也能處理菜單消息。l 盡管任何由盡管任何由ccmdtarget派生的類對象都能接受菜單消息,派生的類對象都能接受
12、菜單消息,但并不是所有這類對象都可以同時(shí)接收到菜單消息,菜單消但并不是所有這類對象都可以同時(shí)接收到菜單消息,菜單消息是按照一定的路徑傳送的,下表列出了當(dāng)息是按照一定的路徑傳送的,下表列出了當(dāng)mfc發(fā)送命令消發(fā)送命令消息給非文檔息給非文檔/視窗結(jié)構(gòu)的應(yīng)用,單文檔應(yīng)用以及多文檔應(yīng)用時(shí),視窗結(jié)構(gòu)的應(yīng)用,單文檔應(yīng)用以及多文檔應(yīng)用時(shí),查找消息映射表的次序。查找消息映射表的次序。查找消息映射表的次序程序類型程序類型搜索路徑搜索路徑sdisdi單文檔單文檔當(dāng)前視圖當(dāng)前視圖 當(dāng)前文檔當(dāng)前文檔 文檔模板文檔模板 主框架窗口主框架窗口 應(yīng)用程序?qū)ο髴?yīng)用程序?qū)ο髆dimdi多文檔多文檔當(dāng)前視圖當(dāng)前視圖 當(dāng)前文檔當(dāng)前
13、文檔 創(chuàng)建文檔的文檔模板創(chuàng)建文檔的文檔模板 活活動(dòng)的子框架窗口動(dòng)的子框架窗口 主框架窗口主框架窗口 應(yīng)用程序?qū)ο髴?yīng)用程序?qū)ο髮υ捒驅(qū)υ捒虍?dāng)前對話框當(dāng)前對話框 對話框的父窗口對話框的父窗口 應(yīng)用程應(yīng)用程序?qū)ο笮驅(qū)ο?應(yīng)用程序收到一個(gè)菜單命令時(shí),它按照一定的順序傳遞該命令,該順序依次為:視窗類、文檔類、主框架類和應(yīng)用類。首先是視窗類獲得處理該命令的機(jī)會(huì),然后是文檔類,再接著是主框架類,最后是應(yīng)用類。如果某個(gè)類沒有相應(yīng)的菜單命令,則該命令返回給上一個(gè)類處理,直到返回到應(yīng)用類。如果其中有一個(gè)類處理了該命令,則直接返回系統(tǒng),其他類就沒有機(jī)會(huì)再處理了。1.4 彈出式菜單彈出式菜單 浮動(dòng)的彈出式菜單是一種新
14、的用戶界面設(shè)計(jì)風(fēng)格。用戶按下鼠標(biāo)右鍵,然后就會(huì)彈出一個(gè)浮動(dòng)菜單。 用資源編輯器和mfc庫的cmenu:trackpopupmenu函數(shù)可以創(chuàng)建彈出式菜單,該函數(shù)的原型:bool trackpopupmenu(unit nflags,int x,int y, cwnd*pwnd, lpcrect lprct=null); 其中參數(shù)nflags為彈出式菜單的標(biāo)志,例如若其值為tpm_rightalign,表示創(chuàng)建的彈出式浮動(dòng)菜單,其右邊界位于x處;若其值為tpm_leftalign,表示其左邊界位于x處,參數(shù)x與y表示屏幕坐標(biāo)。(1)浮動(dòng)菜單的創(chuàng)建)浮動(dòng)菜單的創(chuàng)建創(chuàng)建菜單對象需要兩步。第一步,分配
15、一個(gè)c+對象;第二部,初始化該對象。下面為創(chuàng)建并初始化一個(gè)cmenu類對象的典型代碼:/為浮動(dòng)菜單申請一個(gè)對象空間cmenu pcontexmenu;/初始化 cmenu對象pcontexmenu.loadmenu(idr_menu1); (2)浮動(dòng)菜單的顯示 浮動(dòng)菜單創(chuàng)建和初始化后,在用戶單擊了鼠標(biāo)右鍵時(shí)顯示。下面的wm_rbuttondown消息處理函數(shù)就可以顯示出上面例子中的浮動(dòng)菜單。void mymainframe:onrbuttondown(unit nflags,cpoint point)/首先將客戶區(qū)坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo) clienttoscreen(&point);/在鼠
16、標(biāo)的位置顯示浮動(dòng)菜單 cmenu* pmenu=pcontexmenu-getsubmenu(0); pmenu- trackpopupmenu ( tpm_leftalign|tpm_rightbutton,point.x,point.y,this);/調(diào)用缺省的處理函數(shù)cframewnd:onrbuttondown(nflags,point);1.5彈出式菜單設(shè)計(jì)按照如下步驟創(chuàng)建彈出式菜單。(1)選擇“insert/resource”菜單命令,將彈出“insert resource”窗體,選中“menu”選項(xiàng),然后單擊“new”,將產(chǎn)生一個(gè)空的“id_menu1”菜單。(2)雙擊選擇“id
17、r_mainframe”菜單,然后右鍵單擊“graph”菜單項(xiàng),在彈出式菜單中選擇“copy”命令。(3)雙擊選擇“id_menu1”菜單,右鍵單擊第一個(gè)空的菜單,在彈出菜單中選擇“paste”命令,將產(chǎn)生一個(gè)菜單項(xiàng)。(4)用classwizard在視圖類中加入wm_rbuttondown消息控制函數(shù),然后加入程序代碼如下: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)編譯運(yùn)行程序,在運(yùn)行的窗口中,右鍵單擊,即可顯示出彈出式菜單,并執(zhí)行相應(yīng)的命令。2. cmenu類2.1cmenu類簡介l mfc是靠cmenu來管理菜單的。cmenu對象可以代表每個(gè)windows菜單,其中包括頂級菜單項(xiàng)以及與之相關(guān)聯(lián)的彈出式菜單。l當(dāng)窗口的create或loadframe函數(shù)被調(diào)用的時(shí)候,菜單的資源是直接附加到框架窗口的,cwnd成員函數(shù)getmenu返回一個(gè)臨時(shí)cmenu指針。利用該指針,可以自由地訪問和更新菜單對象。lid_
19、mainframe是標(biāo)識資源腳本中的初始菜單。如果想在應(yīng)用程序啟動(dòng)之后想要第二個(gè)菜單,可以使用菜單編輯器創(chuàng)建一個(gè)具有自己的資源id的菜單資源。然后在程序中構(gòu)造一個(gè)cmenu對象,使用cwnd:loadmenu函數(shù)從這個(gè)資源中加載菜單,調(diào)用cwnd:setmenu函數(shù)將新菜單附加到框架窗口。然后調(diào)用detach成員函數(shù)來分離該對象的hmenu句柄,這樣當(dāng)cmenu對象超出范圍的時(shí)候,菜單就不會(huì)被破壞了。 菜單對象實(shí)際上是由一個(gè)子菜單的嵌套結(jié)構(gòu)組成的。可以使用getsubmenu成員函數(shù)來獲得指向包含在主cmenu對象的彈出式菜單的指針。 cmenu:getmenustring函數(shù)返回對應(yīng)于基于0
20、的索引或命令id的菜單項(xiàng)字符串。如果使用的是命令id選項(xiàng),那么菜單連同任何子菜單一起被搜索。2.2動(dòng)態(tài)改變菜單有時(shí)需要在運(yùn)行時(shí)為響應(yīng)程序狀態(tài)的改變而頻繁地動(dòng)態(tài)增加或刪除菜單項(xiàng)。在運(yùn)行時(shí)為響應(yīng)出現(xiàn)的狀態(tài)而改變的菜單項(xiàng)稱為動(dòng)態(tài)菜單。動(dòng)態(tài)菜單的好處是它給用戶提供了一套適合于程序當(dāng)前狀態(tài)的選項(xiàng)列表。(1)獲得菜單的指針獲得菜單的指針 增加或刪除一個(gè)菜單時(shí),需要菜單的指針。為獲得菜單的指針,應(yīng)使用getmenu()函數(shù)。 cmenu* cwnd:getmenu()const 如果cwnd對象沒有菜單,則返回值為null。如果cwnd對象是一個(gè)子窗口,則返回值是無意義的。該函數(shù)返回的指針是臨時(shí)性的,不要把
21、它保存下來長期使用。 給出窗口的主菜單的指針后,就可以使用getsubmenu()函數(shù)來簡單地獲得包含在主菜單內(nèi)的彈出式子菜單的指針。該函數(shù)的原型如下:cmenu*getsubmenu(int npos)const; 該函數(shù)用于獲得一個(gè)彈出式菜單的cmenu對象的指針。 若指定位置有一個(gè)彈出式菜單,則返回一個(gè)指向cmenu對象的指針,該對象的m_hmenu成員包含彈出菜單的指針;否則返回null。若cmenu對象不存在,則生成一個(gè)模板,cmenu指針將被保留。在獲得菜單的指針后,就可以為菜單添加或刪除菜單項(xiàng)了。(2)給菜單中增加菜單項(xiàng) 為了在運(yùn)行時(shí)給菜單增加菜單項(xiàng),應(yīng)當(dāng)使用insertmenu
22、()函數(shù),該函數(shù)的原型如下:bool insertmenu(uint nposition,unit nflags,unit nidnewitem=0,lpctstr lpsznewitem=null);bool insertmenu(unit nposition,nuit nflags,unit nidnewitem,const cbitmap*pbmp); 該函數(shù)用于向一個(gè)菜單中nposition指定的位置處插入一個(gè)菜單,并把其他項(xiàng)向后移。其應(yīng)用程序可以用對nflags賦值的辦法設(shè)置此菜單項(xiàng)的狀態(tài)。 nidnewitem指定插入菜單項(xiàng)的id值。lpsznewitem指定菜單項(xiàng)的顯示文本 只要
23、當(dāng)窗口中的菜單發(fā)生了變化(無論窗口是否顯示)時(shí),就要調(diào)用cwnd:drawmenubar()函數(shù)。 第二種形式的insertmenu()函數(shù)的pbmp指定圖形菜單項(xiàng)所用的位圖。(3)刪除菜單項(xiàng) 為了刪除菜單項(xiàng),應(yīng)當(dāng)使用deletemenu()函數(shù),該函數(shù)原型如下所示: bool deletemenu(unit nposition,unit nflags); 若菜單項(xiàng)有一隸屬彈出式菜單時(shí),deletemenu將破壞該彈出式菜單,釋放由此彈出菜單所占用的內(nèi)存。 (4)獲得菜單的菜單項(xiàng)數(shù) 在動(dòng)態(tài)處理菜單時(shí),需要頻繁地知道一個(gè)菜單中有多少菜單項(xiàng)。為了獲得菜單項(xiàng)的數(shù)目,應(yīng)當(dāng)使用如下的getmenuite
24、mcont()函數(shù)。 cmenu:getmenuitemcount uint getmenuitemcount()const該函數(shù)確定頂層或彈出式菜單項(xiàng)的項(xiàng)數(shù)。(5)使菜單項(xiàng)有效或無效 有時(shí)候,一些菜單項(xiàng)只適用于某些狀態(tài),而不適用于其他的狀態(tài)。在這種情況下,需要使之暫時(shí)無效,之后再使其有效,為此可使用enablemenuitem()函數(shù)。cmenu:enablemenuitemunit enablemenuitem(unit nidenableitem,unit nenable);該函數(shù)可以設(shè)置菜單項(xiàng),使菜單項(xiàng)可用、禁止或變灰。nidenableitem確定要改動(dòng)的菜單項(xiàng)。該函數(shù)調(diào)用成功時(shí),返
25、回先前的狀態(tài)(mf_dissabled、mf_enable或mf_grayed),調(diào)用失敗時(shí)返回-1。2.3動(dòng)態(tài)菜單設(shè)計(jì)菜單既可以從資源模板中加載,也可以在程序中通過動(dòng)態(tài)方式進(jìn)行創(chuàng)建,本節(jié)將通過在graph菜單項(xiàng)下動(dòng)態(tài)增加三個(gè)子菜單項(xiàng),來改變顯示區(qū)的背景顏色,具體方法如下:(1)選擇菜單項(xiàng)“viewresource symbolsnew”,在“name”文本編輯框中輸入“id_color1”,系統(tǒng)自動(dòng)子在“value”框中加入一個(gè)值,單擊“ok”,關(guān)閉“new symbol”。用同樣方法,加入“id_color2,id_color3”的定義。(2)在在視圖類中加入視圖類中加入oninitial
26、update函數(shù),函數(shù),加入程序代碼如下: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()函數(shù)來增加3個(gè)菜單項(xiàng)。(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);該函數(shù)用于傳遞3個(gè)菜單命令的wm_command和update_command_ui消息到函數(shù)doselectcolor(i),doupdateselectcolor(i,(ccmdui*)pextra)。 (6)右鍵點(diǎn) “cmenuitemview”類,在彈出的窗口里選擇“add menmber functi
30、on”菜單項(xiàng),在“add menmber function”窗口的“function type”框中輸入“void”,在“function declaration”框中輸入“doselectcolor(int icolor)”,其余接受缺省設(shè)置。用同樣方式設(shè)置doupdateselectcolor(int icolor,ccmdui*pcmdui)函數(shù)。設(shè)置完成后,加入下面代碼。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);該函數(shù)更新相應(yīng)菜單項(xiàng)設(shè)置。(7)編譯運(yùn)行該應(yīng)用程序,然后分別測試3個(gè)顏色菜單項(xiàng)是否滿足要求。 工具欄 工具欄是一系列工具按鈕的組合,借助它們可以提高用戶的工作效率。 vc6.0系統(tǒng)保存了每個(gè)工具欄相應(yīng)的位圖,其中包括所有按鈕的圖像,它們具有相同的尺寸(高15像素,寬16像素),它們在位圖中的排列次序與屏幕上按鈕在工具欄上的
32、次序相同。1 使用工具欄編輯器 選擇菜單選擇菜單“文件文件”“打開工作區(qū)打開工作區(qū)”,將前面的單,將前面的單文檔應(yīng)用程序文檔應(yīng)用程序調(diào)入。在項(xiàng)目工作區(qū)窗口中選擇調(diào)入。在項(xiàng)目工作區(qū)窗口中選擇resourceview頁面,雙擊頁面,雙擊“toolbar”項(xiàng)中的項(xiàng)中的idr_mainframe則工具欄編輯器出現(xiàn)在主界面的右則工具欄編輯器出現(xiàn)在主界面的右邊。邊。 空按鈕空按鈕圖形工圖形工具箱具箱顏色工顏色工具箱具箱1 使用工具欄編輯器 1.1 創(chuàng)建一個(gè)新的工具欄按鈕創(chuàng)建一個(gè)新的工具欄按鈕 在新建的工具欄中,最右端總有一個(gè)空按鈕,在新建的工具欄中,最右端總有一個(gè)空按鈕,雙擊該雙擊該按鈕彈出其屬性對話框,
33、在按鈕彈出其屬性對話框,在id框中輸入其標(biāo)識符名稱,框中輸入其標(biāo)識符名稱,其右端又出現(xiàn)一個(gè)新的空按鈕。其右端又出現(xiàn)一個(gè)新的空按鈕。單擊按鈕,在資源編輯單擊按鈕,在資源編輯器的工具按鈕設(shè)計(jì)窗口可以進(jìn)行工具按鈕的位圖繪制。器的工具按鈕設(shè)計(jì)窗口可以進(jìn)行工具按鈕的位圖繪制。1.2 移動(dòng)一個(gè)按鈕移動(dòng)一個(gè)按鈕 在工具欄中移動(dòng)一個(gè)按鈕,用在工具欄中移動(dòng)一個(gè)按鈕,用鼠標(biāo)左鍵點(diǎn)中鼠標(biāo)左鍵點(diǎn)中它并拖動(dòng)它并拖動(dòng)至相應(yīng)位置即可。至相應(yīng)位置即可。如果用戶拖動(dòng)它離開如果用戶拖動(dòng)它離開工具欄位置,則此按鈕從工具欄中消失。若在移工具欄位置,則此按鈕從工具欄中消失。若在移動(dòng)一個(gè)按鈕的同時(shí),按下動(dòng)一個(gè)按鈕的同時(shí),按下ctrl鍵,
34、則在新位置復(fù)鍵,則在新位置復(fù)制一個(gè)按鈕,新位置可以是同一個(gè)工具欄中的其制一個(gè)按鈕,新位置可以是同一個(gè)工具欄中的其他位置,也可在不同的工具欄中他位置,也可在不同的工具欄中。1 使用工具欄編輯器1.3 刪除一個(gè)按鈕刪除一個(gè)按鈕 將選取中的按鈕拖離工具欄,則該按鈕將選取中的按鈕拖離工具欄,則該按鈕就消失了。就消失了。但若選中按鈕后,單擊但若選中按鈕后,單擊delete鍵并不能刪除一個(gè)按鈕,只是將按鈕中的鍵并不能刪除一個(gè)按鈕,只是將按鈕中的圖形全部以背景色填充。圖形全部以背景色填充。 1 使用工具欄編輯器1.4. 在工具欄中插入空格在工具欄中插入空格 在工具欄中插入空格有以下幾種情況:在工具欄中插入空
35、格有以下幾種情況:l如果按扭前沒有任何空格,如果按扭前沒有任何空格,拖動(dòng)該按鈕向右移動(dòng)并當(dāng)覆拖動(dòng)該按鈕向右移動(dòng)并當(dāng)覆蓋相鄰按鈕的一半以上時(shí),釋放鼠標(biāo)鍵,則此按鈕前出現(xiàn)蓋相鄰按鈕的一半以上時(shí),釋放鼠標(biāo)鍵,則此按鈕前出現(xiàn)空格??崭?。l如果按鈕前有空格而按鈕后沒有空格,如果按鈕前有空格而按鈕后沒有空格,拖動(dòng)該按鈕向左拖動(dòng)該按鈕向左移動(dòng)并當(dāng)按鈕的左邊界接觸到前面按鈕時(shí),釋放鼠標(biāo)鍵,移動(dòng)并當(dāng)按鈕的左邊界接觸到前面按鈕時(shí),釋放鼠標(biāo)鍵,則此按鈕后將出現(xiàn)空格。則此按鈕后將出現(xiàn)空格。l如果按鈕前后均有空格,如果按鈕前后均有空格,拖動(dòng)該按鈕向右移動(dòng)并當(dāng)接觸拖動(dòng)該按鈕向右移動(dòng)并當(dāng)接觸到相鄰按鈕時(shí),則此按鈕前的空格保
36、留,按鈕后的空格消到相鄰按鈕時(shí),則此按鈕前的空格保留,按鈕后的空格消失。相反,拖動(dòng)該按鈕向左移動(dòng)并當(dāng)接觸到前一個(gè)相鄰按失。相反,拖動(dòng)該按鈕向左移動(dòng)并當(dāng)接觸到前一個(gè)相鄰按鈕時(shí),則此按鈕前面的空格消失,后面的空格保留。鈕時(shí),則此按鈕前面的空格消失,后面的空格保留。1 使用工具欄編輯器 1.5. 工具欄按鈕屬性的設(shè)置工具欄按鈕屬性的設(shè)置雙擊某按鈕彈出其屬性對話框,如圖所示。雙擊某按鈕彈出其屬性對話框,如圖所示。項(xiàng) 目含 義id工具欄按鈕的標(biāo)識符,用戶既可以輸入自己的標(biāo)識符名稱,也可從id框的下拉列表中選取標(biāo)識符名稱寬(width)工具欄按鈕的象素寬度高(height)工具欄按鈕的象素高度提示(pro
37、mpt)工具欄按鈕提示文本;若為“建立新文檔n新建”,則表示將鼠標(biāo)指向該按鈕時(shí),在狀態(tài)欄中顯示“建立新文檔”,而在彈出的提示信息中出現(xiàn)“新建”字樣。“n”是它們的分隔轉(zhuǎn)義符2 工具按鈕和菜單項(xiàng)相結(jié)合 工具按鈕和菜單項(xiàng)相結(jié)合是指當(dāng)選擇工具按鈕或菜單工具按鈕和菜單項(xiàng)相結(jié)合是指當(dāng)選擇工具按鈕或菜單命令時(shí),操作結(jié)果是一樣的。命令時(shí),操作結(jié)果是一樣的。 結(jié)合的方法:在工具按鈕的屬性對話框中將按鈕的結(jié)合的方法:在工具按鈕的屬性對話框中將按鈕的id號設(shè)置為相關(guān)聯(lián)的菜單項(xiàng)號設(shè)置為相關(guān)聯(lián)的菜單項(xiàng)id。例:在前面程序基礎(chǔ)上,通過兩個(gè)工具按鈕分別顯示主菜例:在前面程序基礎(chǔ)上,通過兩個(gè)工具按鈕分別顯示主菜單單idr_
38、mainframe和菜單和菜單idr_menu1。 (1) 打開前面的單文檔應(yīng)用程序。打開前面的單文檔應(yīng)用程序。 (2) 利用工具欄編輯器設(shè)計(jì)兩個(gè)工具按鈕。利用工具欄編輯器設(shè)計(jì)兩個(gè)工具按鈕。2 工具按鈕和菜單項(xiàng)相結(jié)合 (3) 雙擊剛才設(shè)計(jì)的第一個(gè)工具按鈕,彈出該工具按雙擊剛才設(shè)計(jì)的第一個(gè)工具按鈕,彈出該工具按鈕的屬性對話框,將該工具按鈕的鈕的屬性對話框,將該工具按鈕的id號設(shè)為號設(shè)為id_test_return,在提示框內(nèi)鍵入,在提示框內(nèi)鍵入“返回應(yīng)用程序返回應(yīng)用程序主菜單主菜單n返回主菜單返回主菜單”。 (4) 雙擊剛才設(shè)計(jì)的第二個(gè)工具按鈕,彈出該工具按雙擊剛才設(shè)計(jì)的第二個(gè)工具按鈕,彈出該工
39、具按鈕的屬性對話框,將該工具按鈕的鈕的屬性對話框,將該工具按鈕的id號設(shè)為號設(shè)為id_vew_test,在提示框內(nèi)鍵入,在提示框內(nèi)鍵入“顯示測試菜單顯示測試菜單n顯顯示測試菜單示測試菜單”。2 工具按鈕和菜單項(xiàng)相結(jié)合(5) 編譯運(yùn)行并測試。程序運(yùn)行后,將鼠標(biāo)移至剛才設(shè)編譯運(yùn)行并測試。程序運(yùn)行后,將鼠標(biāo)移至剛才設(shè)計(jì)的第一個(gè)工具按鈕處,這時(shí)在狀態(tài)欄上顯示出計(jì)的第一個(gè)工具按鈕處,這時(shí)在狀態(tài)欄上顯示出“返回返回應(yīng)用程序主菜單應(yīng)用程序主菜單”信息,若稍等片刻會(huì)彈出提示小窗口,信息,若稍等片刻會(huì)彈出提示小窗口,顯示出顯示出“返回主菜單返回主菜單”字樣,單擊新添加的這兩個(gè)按鈕,字樣,單擊新添加的這兩個(gè)按鈕,
40、會(huì)執(zhí)行相應(yīng)的菜單命令。會(huì)執(zhí)行相應(yīng)的菜單命令。3 多個(gè)工具欄的使用 在用在用mfc appwizard創(chuàng)建的文檔應(yīng)用程序中往往只有創(chuàng)建的文檔應(yīng)用程序中往往只有一個(gè)工具欄,但在實(shí)際應(yīng)用中,常常需要多個(gè)工具欄。一個(gè)工具欄,但在實(shí)際應(yīng)用中,常常需要多個(gè)工具欄。 例:在前面程序基礎(chǔ)上,當(dāng)顯示主菜單例:在前面程序基礎(chǔ)上,當(dāng)顯示主菜單idr_mainframe時(shí),只顯示時(shí),只顯示mfc appwizard創(chuàng)建的工創(chuàng)建的工具欄,當(dāng)顯示菜單具欄,當(dāng)顯示菜單idr_menu1時(shí),則只顯示新添加的工時(shí),則只顯示新添加的工具欄。具欄。 (1) 在項(xiàng)目工作區(qū)的在項(xiàng)目工作區(qū)的resourceview頁面中,展開頁面中,展
41、開toolbar(工具欄工具欄)資源,用鼠標(biāo)單擊資源,用鼠標(biāo)單擊idr_mainframe不松開,按下不松開,按下ctrl鍵,移動(dòng)鼠標(biāo)將鍵,移動(dòng)鼠標(biāo)將idr_mainframe拖拖到到toolbar資源名稱上,復(fù)制了工具欄默認(rèn)資源資源名稱上,復(fù)制了工具欄默認(rèn)資源idr_mainframe,復(fù)制后的資源標(biāo)識系統(tǒng)自動(dòng)設(shè)為,復(fù)制后的資源標(biāo)識系統(tǒng)自動(dòng)設(shè)為idr_mainframe1。3 多個(gè)工具欄的使用 (2) 右擊工具欄資源右擊工具欄資源idr_mainframe1,從彈出的快捷,從彈出的快捷菜單中選擇菜單中選擇properties命令,如圖所示,將命令,如圖所示,將id設(shè)為設(shè)為idr_toolba
42、r1。(3) 雙擊雙擊idr_toolbar1,打開工具欄資源,按圖刪除,打開工具欄資源,按圖刪除不要的工具按鈕。不要的工具按鈕。3 多個(gè)工具欄的使用(4) 在在cmainframe類中添加一個(gè)成員變量類中添加一個(gè)成員變量m_wndtestbar,變量類型為,變量類型為ctoolbar。ctoolbar類封類封裝了工具欄的操作。裝了工具欄的操作。 (5) 在在cmainframe:oncreate函數(shù)中添加工具欄創(chuàng)建代函數(shù)中添加工具欄創(chuàng)建代碼:碼: int cmainframe:oncreate(lpcreatestruct lpcreatestruct) if (cframewnd:oncr
43、eate(lpcreatestruct) = -1) return -1;3 多個(gè)工具欄的使用 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 多個(gè)工具欄的使用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類成員函數(shù),用來讓工具欄類成員函數(shù),用來讓工具欄或其他控制
45、條在窗口進(jìn)行??坎僮鳎瑓?shù)或其他控制條在窗口進(jìn)行??坎僮鳎瑓?shù)cbrs_align_any表示可以??吭诖翱诘娜我贿?。表示可以??吭诖翱诘娜我贿叀?dockcontrolbar是是cframewnd類的成員函數(shù),用來類的成員函數(shù),用來將指定的工具欄或其他控制條進(jìn)行??俊⒅付ǖ墓ぞ邫诨蚱渌刂茥l進(jìn)行???。3 多個(gè)工具欄的使用 createex是是ctoolbar類的成員函數(shù),用來創(chuàng)建一個(gè)工具類的成員函數(shù),用來創(chuàng)建一個(gè)工具欄對象。欄對象。 第第1個(gè)參數(shù)用來指定工具欄所在的父窗口指針,個(gè)參數(shù)用來指定工具欄所在的父窗口指針,this表示表示當(dāng)前的當(dāng)前的cmainframe類窗口指針。類窗口指針。 第
46、第2個(gè)參數(shù)用來指定工具按鈕的風(fēng)格,個(gè)參數(shù)用來指定工具按鈕的風(fēng)格,當(dāng)為當(dāng)為tbstyle_flat時(shí)表示工具按鈕是時(shí)表示工具按鈕是“平面的平面的”。 第第3個(gè)參數(shù)用來指定工具欄的風(fēng)格,個(gè)參數(shù)用來指定工具欄的風(fēng)格,由于這里的工具欄是由于這里的工具欄是cmainframe的子窗口,因此需要指定的子窗口,因此需要指定ws_child | ws_visible ; cbrs_top表示工具欄放置在父窗口的頂表示工具欄放置在父窗口的頂部;部; cbrs_gripper表示工具欄前面有一個(gè)表示工具欄前面有一個(gè)“把手把手” ; cbrs_tooltips 表示允許有工具提示;表示允許有工具提示;cbrs_ f
47、lyby表表示在狀態(tài)欄顯示工具提示文本;示在狀態(tài)欄顯示工具提示文本; cbrs_size_dynamic 表表示工具欄在浮動(dòng)時(shí),其大小是可以動(dòng)態(tài)改變的。示工具欄在浮動(dòng)時(shí),其大小是可以動(dòng)態(tài)改變的。3 多個(gè)工具欄的使用 第第4個(gè)參數(shù)是用來指定工具欄四周的邊框大小,個(gè)參數(shù)是用來指定工具欄四周的邊框大小,一般都一般都為為0。 最后一個(gè)參數(shù)用來指定工具欄這個(gè)子窗口的標(biāo)識最后一個(gè)參數(shù)用來指定工具欄這個(gè)子窗口的標(biāo)識id(與工與工具欄資源標(biāo)識不同具欄資源標(biāo)識不同)。 afx_idw_toolbar是系統(tǒng)內(nèi)部是系統(tǒng)內(nèi)部的工具欄子窗口標(biāo)識,并將的工具欄子窗口標(biāo)識,并將afx_idw_toolbar+1的值的值表示
48、默認(rèn)的狀態(tài)欄子窗口標(biāo)識。如果在創(chuàng)建新的工具欄時(shí)表示默認(rèn)的狀態(tài)欄子窗口標(biāo)識。如果在創(chuàng)建新的工具欄時(shí)沒有指定相應(yīng)的子窗口標(biāo)識,則會(huì)使用默認(rèn)的沒有指定相應(yīng)的子窗口標(biāo)識,則會(huì)使用默認(rèn)的afx_idw_toolbar。這樣當(dāng)打開。這樣當(dāng)打開“查看查看”菜單時(shí),單菜單時(shí),單擊擊“工具欄工具欄”菜單時(shí),顯示或隱藏的工具欄不是原來的工菜單時(shí),顯示或隱藏的工具欄不是原來的工具欄而是新添加的工具欄。因此需要重新指定工具欄子窗具欄而是新添加的工具欄。因此需要重新指定工具欄子窗口的標(biāo)識,并使其值等于口的標(biāo)識,并使其值等于afx_idw_toolbar + 10。3 多個(gè)工具欄的使用(6) 編譯運(yùn)行,結(jié)果如圖所示編譯運(yùn)行,結(jié)果如圖所示 (7) 本例希望本例希望idr_toolbar1工具欄
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- PLC控制系統(tǒng)的自動(dòng)化送料裝車系統(tǒng)設(shè)計(jì)
- 公共教育餐廳管理辦法
- 高速公路行業(yè)的經(jīng)濟(jì)價(jià)值分析
- 團(tuán)隊(duì)合作薪酬管理辦法
- 數(shù)字時(shí)代青少年網(wǎng)絡(luò)素養(yǎng)教育:文明上網(wǎng)提升機(jī)制的探索
- 粳稻花期性狀的遺傳量化與聚合效應(yīng)分析
- 基于《旅游景區(qū)質(zhì)量等級的劃分》的4A景區(qū)評審體系優(yōu)化研究
- 拜占庭藝術(shù)的魅力與傳承
- 民族成人登記管理辦法
- 江蘇牛羊屠宰管理辦法
- 餐飲約束員工管理制度
- PLC基礎(chǔ)知識課件下載
- 2025年中級消防設(shè)施操作員(監(jiān)控類)資格理論必背考試題庫(附答案)
- 2023秸稈類生物質(zhì)能源原料儲存規(guī)范第1部分:存放
- DB11 T 212-2009 園林綠化工程施工及驗(yàn)收規(guī)范
- 感染性腹瀉患者護(hù)理常規(guī)
- 2023年1月國家開放大學(xué)漢語言文學(xué)本科《古代詩歌散文專題》期末紙質(zhì)考試試題及答案
- 2025年房東租房合同模板電子版
- 2025年中國智能城市軌道交通行業(yè)市場發(fā)展監(jiān)測及投資戰(zhàn)略咨詢報(bào)告
- 車輛檢測機(jī)構(gòu)整改報(bào)告模板
- DB37-T 2040-2023 金屬礦山尾礦干排安全技術(shù)規(guī)范
評論
0/150
提交評論