資源描述:
《mfc菜單欄下拉菜單圖片設(shè)置》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、VCMFC菜單欄(CMenu)控件?(2011-07-0212:49)分類:?C++菜單欄在對話框窗口里顯示菜單欄像工具欄一樣,菜單欄在按件面板里沒有對應(yīng)的選項(xiàng),但有一個(gè)菜單控件類CMenu,所以如果想要在對話框里顯示菜單欄,就得像工具欄那樣,到ResourceView選項(xiàng)卡里新建一個(gè)菜單欄資源,步驟跟新建工具欄資源一樣,只是資源類型是:Menu,菜單資源設(shè)計(jì)如下圖:如果想改菜單項(xiàng)文本內(nèi)容的話,方法是右擊要更改的菜單項(xiàng),選擇屬性,接著會彈出這樣一個(gè)對話框:上面那個(gè)ID項(xiàng)就是該菜單項(xiàng)對應(yīng)的ID號了
2、,添加菜單項(xiàng)單擊消息處理函數(shù)時(shí)會用到,而標(biāo)明項(xiàng)里的內(nèi)容就是菜單項(xiàng)要顯示的文本了。這里還得注意一下“彈出”這個(gè)選項(xiàng),勾上這個(gè)選項(xiàng)表明對應(yīng)的菜單項(xiàng)還有下級菜單,如:上面“轉(zhuǎn)到”這個(gè)菜單項(xiàng)具有彈出屬性,有下級菜單設(shè)計(jì)好了菜單資源,接著我們就來在對話框顯示菜單欄吧,方法是進(jìn)入對話框編輯區(qū),右擊對話框界面,選擇屬性,然后在菜單項(xiàng)里選擇菜單資源ID號,回車,編譯,運(yùn)行,效果如下圖:當(dāng)然還有第二種在對話框顯示菜單的方法:調(diào)用SetMenu函數(shù)把菜單跟對話框關(guān)聯(lián)起來,函數(shù)第一個(gè)參數(shù)是窗口句柄,第二個(gè)參數(shù)是菜單句
3、柄。在OnInitDialog函數(shù)里添加如下語句:?CMenumenu;//定義一個(gè)菜單類變量?menu.LoadMenu(IDR_MENU1);//裝載IDR_MENU1菜單資源?SetMenu(&menu);//和當(dāng)前窗口關(guān)聯(lián)起來?menu.Detach();//分離如果要處理菜單項(xiàng)單擊消息的話,方法跟處理工具欄項(xiàng)單擊消息一樣,進(jìn)入類向?qū)В业綄?yīng)的菜單項(xiàng)ID,為它添加COMMAND消息處理函數(shù)。?設(shè)置菜單左邊顯示位圖和背景位圖CMenu類里要了解的函數(shù)SetMenuItemBitmaps/
4、/設(shè)置菜單項(xiàng)左邊的位圖函數(shù)定義:BOOLSetMenuItemBitmaps(UINTnPosition,UINTnFlags,constCBitmap*pBmpUnchecked,constCBitmap*pBmpChecked);nPostion指明具體要設(shè)置的菜單項(xiàng),可以是菜單項(xiàng)索引,菜單項(xiàng)ID,具體由nFlags參數(shù)指明,為MF_BYPOSITION,則以菜單項(xiàng)索引指明,為MF_BYCOMMAND則第一個(gè)參數(shù)nPosition是菜單項(xiàng)ID號。pBmpUnchecked未被檢測時(shí)顯示的位圖
5、(正常時(shí)),pBmpChecked檢測時(shí)顯示的圖片(就是菜單項(xiàng)被打上勾時(shí)所顯示的圖片,跟CheckMenuItem函數(shù)有關(guān)聯(lián))一個(gè)API函數(shù)SetMenuInfo,這個(gè)函數(shù)可以設(shè)置菜單重繪時(shí)選擇的填充畫刷類型,該函數(shù)有兩個(gè)參數(shù),第一個(gè)是要設(shè)置的菜單句柄,第二個(gè)是一個(gè)MENUINFO結(jié)構(gòu)指針,我們只要了解這結(jié)構(gòu)里有一個(gè)成員hbrBack就行了,hbrBack是一個(gè)畫刷句柄,而菜單背景位圖就通過創(chuàng)建位圖畫刷來實(shí)現(xiàn)的。好了,以上面的工程為例,引入三張位圖,ID號默認(rèn)不變,然后再引入一張位圖(菜單背景位
6、圖,ID:IDB_MENUBACK),接著在對話框類的OnInitDialog函數(shù)里添加如下語句:CMenu*pMenu=GetMenu();//獲取對話框關(guān)聯(lián)菜單?CMenu*pSubMenu=pMenu->GetSubMenu(0);//獲得子菜單(如果有)0表示索引,對應(yīng)“文件”菜單?for(inti=0;i<3;i++)?{????CBitmapbmp;????bmp.LoadBitmap(IDB_BITMAP1+i);?pSubMenu->SetMenuItemBitmaps(i,MF
7、_BYPOSITION,&bmp,&bmp);??bmp.Detach();?}?CBitmapbmp;?CBrushm_BKBrush;?bmp.LoadBitmap(IDB_MENUBACK);?m_BKBrush.CreatePatternBrush(&bmp);//創(chuàng)建位圖畫刷?MENUINFOmnInfo;?memset(&mnInfo,0,sizeof(MENUINFO));?mnInfo.cbSize=sizeof(MENUINFO);?mnInfo.fMask=MIM_BACKG
8、ROUND;?mnInfo.hbrBack=m_BKBrush;?::SetMenuInfo(pSubMenu->m_hMenu,&mnInfo);???m_BKBrush.Detach();運(yùn)行效果如下圖:(PS:不知道大家有沒有碰到過這個(gè)問題,MENUINFO結(jié)構(gòu)未定義,解決的方法是進(jìn)入文件選項(xiàng)卡(FileView),在Source?File文件下的StdAfx.cpp文件里的最前面部分添加這個(gè)語句:#define?WINVER0x0501)設(shè)計(jì)彈出式菜單?CMenu類里要了解的函數(shù):Tra