計(jì)算機(jī)從基礎(chǔ)到提高《菜單和加速鍵》_第1頁
計(jì)算機(jī)從基礎(chǔ)到提高《菜單和加速鍵》_第2頁
計(jì)算機(jī)從基礎(chǔ)到提高《菜單和加速鍵》_第3頁
計(jì)算機(jī)從基礎(chǔ)到提高《菜單和加速鍵》_第4頁
計(jì)算機(jī)從基礎(chǔ)到提高《菜單和加速鍵》_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章使用資源第5章使用資源資源文件的”源文件”是以rc

為擴(kuò)展名的腳本文件,由資源編譯器Rc.exe

編譯為以res為擴(kuò)展名的二進(jìn)制資源文件。在鏈接的時(shí)候由Link.exe

鏈入可執(zhí)行文件中,這幾節(jié)課,小甲魚將給大家介紹資源的定義方法,以及在程序中的使用方法。在編寫一個(gè)Win32程序,與界面有關(guān)的代碼起碼要占一半以上,而與界面相關(guān)的代碼中,又有大部分涉及各種資源和控件的使用。5.1.2菜單和加速鍵的資源定義演示:Menu.exe資源腳本文件定義:Menu.rc新的makefile

文件:Makefile注意:在rc

文件中,各種語句使用的是C語言的格式,因?yàn)橘Y源編譯器rc.exe

根本上就是從VisualC++提取出來的。宏定義用的是#define十六進(jìn)制表達(dá)是0x1234注釋用的是//注釋內(nèi)容或/*注釋內(nèi)容*/1.菜單的定義雖說純代碼自己寫資源的定義是非常不靠譜和浪費(fèi)大好青春的舉動(dòng),但是看懂代碼是展現(xiàn)我們良好技術(shù)功底的基本需求,所以這節(jié)課通過示例代碼給大家簡單的講解下構(gòu)造和如何調(diào)用。菜單的定義在資源腳本文件中菜單的定義格式是:菜單IDMENU[DISCARDABLE]BEGIN菜單項(xiàng)定義…END1.菜單的定義“菜單IDMENU[DISCARDABLE]”語句用來指定菜單的ID值和內(nèi)存屬性,菜單ID可以是16位的整數(shù),范圍是1~65535,但菜單ID也可以用字符串表示,如下面的定義:MainMenumenu表示菜單的ID是字符串型的”MainMenu”,但這樣定義的話,在程序中引用的時(shí)候就要用字符串指針代替16進(jìn)制的菜單ID值,顯得相當(dāng)不便,所以在實(shí)際應(yīng)用中通常使用16進(jìn)制數(shù)值當(dāng)做菜單ID。1.菜單的定義數(shù)值型ID的范圍限制在1~65535之間的原因是字符串在內(nèi)存中的線性地址總是大于10000h,API函數(shù)檢測參數(shù)時(shí)發(fā)現(xiàn)小于10000h時(shí)就可以把它認(rèn)為是數(shù)值型的,大于10000h時(shí)就當(dāng)做字符串指針處理。友情提示:10000h==655361.菜單的定義menu關(guān)鍵字后面的DISCARDABLE是菜單的內(nèi)存屬性,表示菜單在不再使用的時(shí)候可以暫時(shí)從內(nèi)存中釋放以節(jié)省內(nèi)存,這是一個(gè)可選屬性。另外,菜單項(xiàng)的定義語句必須包含在BEGIN和END關(guān)鍵字之內(nèi),這兩個(gè)關(guān)鍵字也可以用花括號{和}來代替。菜單項(xiàng)目的定義方法有3類:雙層牛肉巨無霸,板燒雞腿堡,老北京雞肉卷(據(jù)說智商超過160才能理解。。。。。。)1.菜單的定義方法一:MENUITEM菜單文字

命令I(lǐng)D[,選項(xiàng)列表]

方法二:MENUITEMSEPARATOR方法三:POPUP菜單文字[,選項(xiàng)列表]

(用法3)BEGINitem-definitions...END1.菜單的定義下面分別就這3類詳細(xì)說明方法一組成部分如下:菜單文字命令I(lǐng)D選項(xiàng):CHECKED,GRAYED,INACTIVE,MENUBREAK或MENUBARBREAK實(shí)驗(yàn):當(dāng)把例子中的“詳細(xì)資料”及以后的菜單項(xiàng)都另起一列。1.菜單的定義方法二定義的是菜單項(xiàng)之間的分隔線,顯然,分隔線是不需要字符串和選項(xiàng)的。方法三定義的是彈出式菜單(popup菜單),頂層菜單是由多個(gè)彈出式子菜單組成的。popup菜單的選項(xiàng)列表可以是以下的值:

GRAYED,

INACTIVE,HELP注:popup菜單項(xiàng)選中的時(shí)候會(huì)自動(dòng)將彈出式菜單彈出來,不需要向程序發(fā)送消息,所以在定義的參數(shù)中不需要命令I(lǐng)D。2.加速鍵的定義和菜單的定義相比,加速鍵的定義要簡單得多,具體的語法如下:加速鍵IDACCELERATORSBEGIN鍵名,命令I(lǐng)D[,類型][,選項(xiàng)]...END加速鍵ID同樣可以是一個(gè)字符串或者是1~65535之間的數(shù)字,整個(gè)定義內(nèi)容也是用begin和end(或花括號)包含起來。2.加速鍵的定義每個(gè)鍵占據(jù)一行,各字段的含義如下:鍵名:表示加速鍵對應(yīng)的按鍵,可以有3種方式定義"^字母":表示Ctrl鍵加上字母鍵"字母":表示字母,這時(shí)類型必須指明是VIRTKEY數(shù)值:表示ASCII碼為該數(shù)值的字母,這時(shí)類型必須指明為ASCII。命令I(lǐng)D:按下加速鍵后,Windows向程序發(fā)送的命令I(lǐng)D。把加速鍵和菜單項(xiàng)關(guān)聯(lián)起來,要做的就是關(guān)聯(lián)菜單項(xiàng)的命令I(lǐng)D。2.加速鍵的定義類型:用來指定鍵的定義方式,可以是VIRTKEY和ASCII,分別用來表示”鍵名”字段定義的是虛擬鍵還是ASCII碼。選項(xiàng):可以是Alt,Control或Shift中的單個(gè)或多個(gè),如果指定多個(gè),則中間用逗號隔開,表示加速鍵是按鍵加上這些控制鍵的組合鍵。這些選項(xiàng)只能在類型是VIRTKEY的情況下才能使用。動(dòng)手時(shí)間!注意為Resedit設(shè)置include路徑。TIPS在一個(gè)資源腳本文件中,可以定義多個(gè)菜單和多個(gè)加速鍵表,當(dāng)然也有其他各式各樣的資源,有位圖、圖標(biāo)與對話框等,這就涉及為這些資源取ID值的問題,取值的時(shí)候要掌握的原則是:

(1)對于同類別的多個(gè)資源,資源ID必須為不同的值,如定義了兩個(gè)菜單,那么它們的ID就必須用不同的數(shù)值表示,否則將無法分辨。

(2)對于不同類別的資源,資源ID在數(shù)值上可以是相同的,如可以將菜單和加速鍵的ID都定義為1,同時(shí)也可以有ID為1的位圖或圖標(biāo)等,Windows并不會(huì)把它們搞混。5.1.3使用菜單和加速鍵在完成資源文件所示的編寫后,我們來看看如何在程序中使用菜單和加速鍵。例子程序的運(yùn)行界面:Menu.exe接下來,將帶大家逐步分析這些功能是如何實(shí)現(xiàn)的。Menu.asm代碼是在FirstWindow程序的基礎(chǔ)上改寫的,這是編寫Win32匯編程序的一個(gè)常用方法——拷貝一個(gè)模板程序再進(jìn)行修改會(huì)節(jié)省很多的時(shí)間。

1.加載菜單在窗口中加載菜單的方法在第4章已經(jīng)提及,方法有兩個(gè):一是在注冊窗口類的時(shí)候指定類的默認(rèn)菜單;二是在建立窗口的時(shí)候在參數(shù)中指定菜單句柄。Menu.asm程序中明顯用的是第2種方法。注意到參數(shù)中的hMenu。也就是說不管用哪種方法,都必須先獲取菜單句柄存入hMenu,才能對菜單進(jìn)行操作。1.加載菜單我們使用LoadMenu函數(shù)來得到菜單句柄。invoke

LoadMenu,hInstance,IDM_MAINmovhMenu,eax猛然發(fā)現(xiàn),這個(gè)函數(shù)需要用到兩個(gè)參數(shù),第一個(gè)是實(shí)例的句柄,第二個(gè)是準(zhǔn)備打開的菜單。第一個(gè)參數(shù)我們用GetModuleHandle獲取的實(shí)例句柄,第二個(gè)參數(shù)指定需要裝入的菜單資源ID,函數(shù)返回菜單句柄。在得到菜單句柄以后,我們把它放入hMenu。1.加載菜單另外,當(dāng)資源文件中用字符串為名稱定義菜單而不是用數(shù)值的時(shí)候,例如:MainMenu

menu//菜單名為字符串“MainMenu”begin ……end那么在程序中就必須用字符串指針代替菜單ID做參數(shù),這就是之前說比較麻煩的一點(diǎn)。1.加載菜單szMenu

"MainMenu",0

;在數(shù)據(jù)段中定義菜單名稱字符串……invokeLoadMenu,hInstance,addrszMenu

;在程序中裝載movhMenu,eax用字符串為名稱定義資源,在資源裝載函數(shù)LoadXXXX中用字符串指針做參數(shù)裝入,這實(shí)際上是一個(gè)通用的方法,不僅適用于菜單資源,對于其他類別的資源也是適用的。在其他資源的介紹中就不再另外說明了。2.加載加速鍵和菜單一樣,加速鍵在使用前也要裝入,參數(shù)同樣是在資源腳本文件中定義的加速鍵ID,程序中對應(yīng)的語句是:invoke

LoadAccelerators,hInstance,IDA_MAINmov@hAccelerator,eax其實(shí)我們自己在程序中也可以很方便地實(shí)現(xiàn)加速鍵功能,方法是:截獲WM_KEYDOWN消息并判斷鍵盤消息并按照自定義的邏輯進(jìn)行處理,使用加速鍵實(shí)際上是讓W(xué)indows替我們完成這個(gè)功能。2.加載加速鍵Windows實(shí)現(xiàn)的方法正是在消息循環(huán)中檢查WM_KEYDOWN和WM_SYSKEYDOWN消息。.whileTRUEinvokeGetMessage,addr@stMsg,NULL,0,0.break

.ifeax

==0invoke

TranslateAccelerator,hWinMain,@hAccelerator,addr\ @stMsg.ifeax==0invokeTranslateMessage,addr@stMsginvokeDispatchMessage,addr@stMsg.endif.endw2.加載加速鍵沒錯(cuò),四樓的TranslateAccelerator亮了!TranslateAccelerator函數(shù)是實(shí)現(xiàn)加速鍵功能的核心,它的參數(shù)為目標(biāo)窗口、加速鍵句柄和GetMessage取得的消息結(jié)構(gòu)。該函數(shù)檢查消息結(jié)構(gòu)中的消息,如果遇到WM_KEYDOWN和WM_SYSKEYDOWN消息則檢測加速鍵資源,看按鍵是否符合某個(gè)加速鍵,符合的話則向目標(biāo)窗口發(fā)送WM_COMMAND或WM_SYSCOMMAND

消息,并返回TRUE,不符合的話不進(jìn)行任何處理并返回FALSE。2.加載加速鍵由于加速鍵的鍵碼并不是用戶真正想輸入窗口的,比如用戶在寫字板中輸入文字,按Ctrl+C鍵是為了拷貝,而并不是想把Ctrl+C鍵對應(yīng)的字符輸入文檔。所以這個(gè)Ctrl+C的鍵碼在完成加速鍵的使命后就應(yīng)該丟棄。也就是說符合加速鍵的鍵盤消息不應(yīng)該再發(fā)送給窗口,TranslateMessage和DispatchMessage函數(shù)前的邏輯判斷就是這樣的意圖:只有TranslateAccelerator沒有轉(zhuǎn)換的消息(返回值eax為0)才繼續(xù)處理。3.菜單和加速鍵消息當(dāng)用戶選擇了一個(gè)菜單項(xiàng)的時(shí)候,Windows向菜單所屬的窗口發(fā)送WM_COMMAND消息;而用戶按下了一個(gè)加速鍵的時(shí)候,Windows向TranslateAccelerator函數(shù)指定的目標(biāo)窗口發(fā)送WM_COMMAND消息。一般這兩種情況對應(yīng)的窗口都是主窗口,所以可以在主窗口中的窗口過程中集中處理WM_COMMAND消息,而不必考慮它究竟是菜單引發(fā)的還是加速鍵引發(fā)的。3.菜單和加速鍵消息WM_COMMAND

消息的兩個(gè)參數(shù)是這樣定義的:wParam的高位=wNotifyCode

;通知碼wParam的低位=wID

;命令I(lǐng)DlParam=hwndCtl

;發(fā)送WM_COMMAND的子窗口句柄除了菜單和加速鍵,WM_COMMAND消息也可以由其他子窗口引發(fā),如主窗口的按鈕或工具欄等,lParam參數(shù)指定了引發(fā)消息的子窗口句柄。3.菜單和加速鍵消息對于菜單和加速鍵引發(fā)的WM_COMMAND

消息,lParam的值為零。wParam參數(shù)的低16位是命令I(lǐng)D,也就是資源腳本文件中菜單項(xiàng)的命令I(lǐng)D或加速鍵的命令I(lǐng)D,高16位是通知碼,菜單消息的通知碼是0,加速鍵消息的通知碼為1。在需要處理菜單和加速鍵消息的窗口過程中,一般需要增加一個(gè)WM_COMMAND分支來處理對應(yīng)的消息,這個(gè)分支的一般結(jié)構(gòu)為=>3.菜單和加速鍵消息.elseifeax==

WM_COMMAND

;eax中為wMsgmoveax,wParammovzxeax,ax.ifeax==

命令I(lǐng)D1....elseifeax==

命令I(lǐng)D2....endif3.菜單和加速鍵消息其中movzxeax,ax指令將16位的ax擴(kuò)展到32位的eax,相當(dāng)于將eax的高16位填零。作用就是當(dāng)消息由加速鍵引起時(shí),將高16位中的1忽略,這樣下面的分支就可以同時(shí)處理菜單和加速鍵消息。當(dāng)然我們也可以去掉這一句,這樣下面的比較語句中就要使用ax而不是eax。3.菜單和加速鍵消息敏銳的魚油會(huì)發(fā)覺,資源文件中定義的“字體”菜單項(xiàng)的ID為Ox4201,當(dāng)選中“字體”菜單項(xiàng)的時(shí)候,對話框中顯示的wParam數(shù)值正是00004201。而按下加速鍵Alt+F的時(shí)候,顯示出來的值就是00014201了,它們的區(qū)別就是高16位中的通知碼不同。4.菜單項(xiàng)的修改在程序的運(yùn)行中也可以動(dòng)態(tài)修改菜單項(xiàng),包括添加、刪除和修改操作,這些操作是通過幾個(gè)API函數(shù)來完成的:添加菜單項(xiàng)invokeAppendMenu,hMenu,uFlags,\uIDNewItem,lpNewItem;AppendMenu

用來在一個(gè)菜單的最后添加菜單項(xiàng)。4.菜單項(xiàng)的修改插入菜單項(xiàng)invokeInsertMenu,hMenu,uPosition,uFlags,\uIDNewItem,lpNewItem;InsertMenu

則在中間插入菜單項(xiàng)。uPosition用來定位要操作的菜單項(xiàng),定位的方法有兩種:用命令I(lǐng)D定位或用位置索引當(dāng)uFlags為MF_BYCOMMAND,uPostion為菜單項(xiàng)的命令I(lǐng)D。當(dāng)uFlags為MF_BYPOSITION,uPostion表示菜單項(xiàng)的位置索引,索引是從0開始的。4.菜單項(xiàng)的修改對于AppendMenu和InsertMenu,會(huì)有一個(gè)新的菜單項(xiàng)產(chǎn)生。uIDNewItem就表示這個(gè)新菜單項(xiàng)的命令I(lǐng)DlpNewItem指向新菜單項(xiàng)的文字字符串修改菜單項(xiàng)invokeModifyMenu,hMenu,uPosition,uFlags,\uIDNewItem,lpNewItem;4.菜單項(xiàng)的修改由于ModifyMenu函數(shù)可以修改一個(gè)菜單項(xiàng)的命令I(lǐng)D或文字字符串,所以也有uIDNewItem和lpNewItem參數(shù)。刪除菜單項(xiàng)invokeDeleteMenu,hMenu,uPosition,uFlags;invokeRemoveMenu,hMenu,uPosition,uFlags;4.菜單項(xiàng)的修改DeleteMenu和RemoveMenu的不同之處在于對popup菜單項(xiàng)的處理。DeleteMenu不僅刪除菜單項(xiàng),而且將這個(gè)popup菜單項(xiàng)的所有子項(xiàng)目全部刪除,這樣,這個(gè)popup菜單就不能在別的地方繼續(xù)使用。RemoveMenu僅從菜單中移去這個(gè)popup菜單項(xiàng),整個(gè)popup菜單在內(nèi)存中還是存在的。自己嘗試下修改。5.使用系統(tǒng)菜單系統(tǒng)菜單指按下了標(biāo)題欄圖標(biāo)后彈出的菜單,和窗口菜單不同,選中系統(tǒng)菜單的菜單項(xiàng)后,Windows向窗口發(fā)送的是WM_SYSCOMMAND

消息而非WM_COMMAND消息。默認(rèn)的系統(tǒng)菜單中已經(jīng)有“還原”、“移動(dòng)”、“大小”、“最大化”、“最小化”和“關(guān)閉”等菜單項(xiàng),這些菜單項(xiàng)的命令I(lǐng)D已經(jīng)預(yù)定義為SC_RESTORE,SC_MOVE,SC_SIZE,SC_MAXIMIZE,SC_MINIMIZE和

SC_CLOSE5.使用系統(tǒng)菜單如果魚油們要自己處理它們,可以在WM_SYSCOMMAND

消息中建立一個(gè)比較分支對它們進(jìn)行處理,一般在程序中并不自己處理WM_SYSCOMMAND

消息(沒事找事除外),而是交給DefWindowProc處理。如何在系統(tǒng)菜單中添加自己的菜單項(xiàng)呢?方法就是使用上面介紹的AppendMenu(當(dāng)然也可以用InsertMenu),在添加前必須用GetSystemMenu函數(shù)首先獲取系統(tǒng)菜單的句柄??蠢}源碼去:Menu.asm6.右鍵彈出菜單例子程序的一個(gè)功能是當(dāng)用戶在窗口客戶區(qū)按下鼠標(biāo)右鍵的時(shí)候彈出一個(gè)菜單,這個(gè)功能是用TrackPopupMenu函數(shù)實(shí)現(xiàn)的。invokeTrackPopupMenu,hMenu,uFlags,x,y,nReserved,hWnd,lpRect;這個(gè)函數(shù)本身很簡單,執(zhí)行后在參數(shù)指定的x,y位置彈出一個(gè)屬于hWnd窗口(也就是說WM_COMMAND

消息發(fā)到這個(gè)窗口)的菜單,菜單句柄是hMenu。6.右鍵彈出菜單使用TrackPopupMenu時(shí)要注意的是,彈出的菜單句柄必須是popup類型的,而在資源文件中定義并且可以用LoadMenu函數(shù)裝入的菜單并不是popup類型的。所以在程序中我們要用GetSubMenu得到的第二層子菜單的句柄才是popup類型的。6.右鍵彈出菜單GetSubMenu函數(shù)的用法是:invokeGetSubMenu,hMenu,nPos.ifeax movhSubMenu,eax.endifnPos參數(shù)指定要獲取的菜單的位置索引,GetSubMenu的返回值是獲取的子菜單句柄。6.右鍵彈出菜單這里的x,y是要彈出右鍵菜單的坐標(biāo),一般的話我們讓他跟鼠標(biāo)一起。要獲取鼠標(biāo)位置,可以用GetCursorPos函數(shù):invokeGetCursorPos,lpPoint參數(shù)lpPoint指向一個(gè)POINT數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)只有兩個(gè)字段:POINTSTRUCTxDWORD?yDWORD?POINTENDS6.右鍵彈出菜單uFlags參數(shù)指定一些和位置相關(guān)的選項(xiàng),它可以是PM_CENTERALIGN,TPM_LEFTALIGN或TPM_RIGHTALIGN

三者之一,表示(x,y)坐標(biāo)是代表彈出菜單位置的中間、左上角還是右上角,一般的習(xí)慣是使用TPM_LEFTALIGN,這樣菜單會(huì)在鼠標(biāo)點(diǎn)擊處的右邊彈出。uFlags中同時(shí)還可以指定用鼠標(biāo)左鍵還是右鍵選定菜單項(xiàng),定義值可以是TPM_LEFTBUTTON或TPM_RIGHTBUTTON。6.右鍵彈出菜單lpRect指向一個(gè)RECT結(jié)構(gòu),用來指定一個(gè)區(qū)域,當(dāng)菜單彈出后,在這個(gè)區(qū)域外單擊鼠標(biāo),菜單才會(huì)消失。如果這個(gè)參數(shù)指定為NULL的話,在菜單之外單擊鼠標(biāo),菜單就會(huì)消失。hWnd是設(shè)置擁有快捷菜單的窗口的句柄。此窗口接收來自菜單的所有消息。最后,還有個(gè)nReserved是保留值,必須為零。木有了。。。。。。7.菜單狀態(tài)的檢測和設(shè)置在程序中經(jīng)常要對菜單項(xiàng)的狀態(tài)進(jìn)行設(shè)置。如剪貼板中沒有數(shù)據(jù)時(shí),”粘貼”菜單項(xiàng)應(yīng)該灰化,窗口中沒有被選中的字符時(shí),“拷貝”菜單項(xiàng)也應(yīng)該灰化,這樣可以給使用者一個(gè)善意提醒。同樣,對菜單的狀態(tài)也常常需要檢測,如查看菜單項(xiàng)的狀態(tài)是否處于灰化狀態(tài)或選中狀態(tài)以便進(jìn)行下一步操作等。對菜單項(xiàng)狀態(tài)的檢測可以用GetMenuState函數(shù)來完成。7.菜單狀態(tài)的檢測和設(shè)置invokeGetMenuState,hMenu,uId,uFlags參數(shù)hMenu是菜單的句柄,uId用來定位要檢測的菜單項(xiàng)當(dāng)uFlags是MF_BYCOMMAND的時(shí)候,uId用菜單項(xiàng)的命令I(lǐng)D指定當(dāng)uFlags是MF_BYPOSITION的時(shí)候,uId的值是位置索引函數(shù)執(zhí)行后的返回值為-1時(shí)表示行動(dòng)失敗了。7.菜單狀態(tài)的檢測和設(shè)置否則會(huì)是返回MF_CHECKED(選中),MF_DISABLED(禁用),MF_GRAYED(灰化),MF_HILITE(高亮),MF_MENUBARBREAK(分割線),MF_MENUBREAK(分割線)和MF_SEPARATOR(分割線)的組合值。沒錯(cuò),再次強(qiáng)調(diào),這些都是宏定義的結(jié)果,因此可以通過測試相應(yīng)的數(shù)據(jù)位來分辨菜單項(xiàng)處于哪種狀態(tài)。invokeGetMenuState,hMenu,IDM_XXX,MF_BYCOMMAND.ifeax&MF_CHECKED

;表示IDM_XXX菜單項(xiàng)現(xiàn)在是選中狀態(tài).endif7.菜單狀態(tài)的檢測和設(shè)置當(dāng)然我們還可以設(shè)置菜單的狀態(tài)。設(shè)置菜單項(xiàng)的狀態(tài)可以用下列3個(gè)函數(shù)來實(shí)現(xiàn)不同的功能:invokeEnableMenuItem,hMenu,uIDEnableItem,uEnableinvokeCheckMenuItem,hMenu,uIDCheckItem,uCheckinvokeCheckMenuRadioItem,hMenu,idFirst,idLast,idCheck,\uFlagsEnableMenuItem函數(shù)將菜單項(xiàng)在禁用、可用和灰化狀態(tài)之間切換,uEnable可以取值為MF_DISABLED,MF_ENABLED和MF_GRAYED,分別代表這3種狀態(tài)。7.菜單狀態(tài)的檢測和設(shè)置CheckMenuItem函數(shù)將菜單項(xiàng)在非互斥的選定狀態(tài)和非選定狀態(tài)之間切換(即前面是否有對鉤),uCheck的取值可以是MF_CHECKED或MF_UNCHECKED,代表選定或非選定狀態(tài)。CheckMenuRadioItem將菜單項(xiàng)在互斥的選定狀態(tài)和非選定狀態(tài)之間切換(即前面是否有圓點(diǎn)標(biāo)志),由于互斥的菜單項(xiàng)在一個(gè)范圍內(nèi)只有一個(gè)是可以選定的,當(dāng)選定另一個(gè)的時(shí)候,原來的選定應(yīng)該撤銷。7.菜單狀態(tài)的檢測和設(shè)置idFirst和idLast就指定了這個(gè)互斥范圍。函數(shù)在選定idCheck指定的菜單項(xiàng)的同時(shí)將自動(dòng)清除idFirst和idLast范圍內(nèi)的其他選定。所以uFlags中無需指定狀態(tài),只需指定MF_BYCOMMAND

或MF_BYPOSITION定位方法。在這些函數(shù)的參數(shù)中,uIDEnableItem,uIDCheckItem,idFirst,idLast和idCheck用來定位菜單項(xiàng),同樣,參數(shù)的取值可以是菜單項(xiàng)的命令I(lǐng)D或位置索引。7.菜單狀態(tài)的檢

溫馨提示

  • 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論