源碼
效果圖:
一、CMenuEx菜單類主要接口函數(shù):
1、void InitMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar);
說明:這是最主要的一個(gè)接口。如果要改變主窗口的菜單則應(yīng)在主窗口的OnInitMenu(CMenu *pMenu)中調(diào)用該函數(shù)(如:m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar)),當(dāng)然主窗口必須要有工具欄,才會(huì)產(chǎn)生菜單項(xiàng)位圖。最后還必須重載主窗口的OnMeasureItem()和OnDrawItem()。并在兩個(gè)函數(shù)中分別
調(diào)用菜單類的另外兩個(gè)接口DrawItem()和MeasureItem();
2、void SetHighLightColor(COLORREF crColor);
3、void SetBackColor(COLORREF);
4、void SetTextColor(COLORREF);
以上三個(gè)接口應(yīng)該不用再說明 。
QQ的菜單采用的顏色是
SELECTTEXT_COLOR RGB(0,0,127)
TEXT_COLOR RGB(0,0,0)
BK_COLOR RGB(143,167,207) 效果不錯(cuò)
5、void SetImageLeft(UINT idBmpLeft)
說明:這也是個(gè)重要的接口。要實(shí)現(xiàn)縱向位圖(像“開始”菜單)??梢栽谶m當(dāng)?shù)牡胤秸{(diào)用該函數(shù)。參數(shù)當(dāng)然是位圖的ID值。注意選擇位圖時(shí)要選好看一點(diǎn)的哦!要記得高寬的比例。
6、void InitPopupMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar)
與InitMenu不同的是:InitMenu并不修改第一級(jí)菜單為自繪風(fēng)格,而
該函數(shù)有包括第一級(jí)菜單.
但必須注意:該類的任一實(shí)例都只能調(diào)用這兩個(gè)函數(shù)中的一個(gè),不能一同使用!!!
二、CMenuEx類的具體使用步驟:
2.1 用CMenuEx類加載主窗口菜單的具體步驟:
1、添加CMenuEx成員變量CMenuEx m_menu
2、CMainFrame類添加WM_INITMENU消息,并在實(shí)現(xiàn)函數(shù)中加入代碼: m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar);
IDR_MAINFRAME是工具欄資源ID,m_wndToolBar是工具欄對(duì)象
3、CMainFrame類添加WM_DRAWITEM和WM_MEASUREITEM消息,并在實(shí)現(xiàn)函數(shù)分加入: if(!nIDCtl) m_menu.DrawItem(lpDrawItemStruct);
if(!nIDCtl) m_menu.MeasureItem(lpMeasureItemStruct);
只須這三步就大功造成了!
但是有時(shí)你會(huì)發(fā)現(xiàn)菜單的位圖錯(cuò)位了,這不是程序的錯(cuò)。
這是因?yàn)椤肮ぞ邫谖粓D”的個(gè)數(shù)與“工具欄按鈕個(gè)數(shù)”不符,
你只需把不用的位圖刪掉就可以,或者添加對(duì)應(yīng)的菜單項(xiàng),反正使這兩個(gè)數(shù)目一致就對(duì)了
4、如果你想要讓你的菜單擁有“縱向位圖”(像“開始”菜單),就必須在CMainFrame在OnCreate()中加入: m_menu.SetImageLeft(IDB_BITMAP1);//IDB_BITMAP1是指定位圖
2.2 用CMenuEx類加載彈出菜單的具體步驟:
1、在CChildView類中加入成員變量 CMenuEx m_menu和CToolBar *m_pToolBar
為什么要加入m_pToolBar,這里做一下說明:
因?yàn)樵贑MenuEx的接口函數(shù)InitPopupMenu()中需要工具欄對(duì)象指針,而工具欄對(duì)象又偏偏是CMainFrame類的成員
所以設(shè)此指針變量指向工具欄對(duì)象
2、給CChildView類的成員m_pToolBar賦值。
當(dāng)CView派生類由不得CxxxxDocTemplate產(chǎn)生時(shí),賦值的地方比較特殊
請(qǐng)?jiān)贑xxxWinApp類中的InitInstance()的最后加入代碼:CMainFrame *pFrame=(CMainFrame *)m_pMainWnd;
CChildView *pView=(CChildView *)pFrame->GetActiveView();
pView->m_pToolBar=&(pFrame->m_wndToolBar);//注意:原m_wndToolBar是私有變量,要改成public的哦!
當(dāng)CView派生類是CMainFrame類的成員變量時(shí),就很簡(jiǎn)單,直接在OnCreate()中設(shè)置
3、在CChildView的構(gòu)造函數(shù)中加入設(shè)置彈出菜單的代碼 m_menu.CreatePopupMenu();
m_menu.AppendMenu(0,ID_EDIT_UNDO,"撤消");
m_menu.AppendMenu(MF_SEPARATOR,0);
m_menu.AppendMenu(0,ID_EDIT_COPY,"復(fù)制");
m_menu.AppendMenu(0,ID_EDIT_CUT,"剪切");
m_menu.AppendMenu(0,ID_EDIT_PASTE,"粘貼");//當(dāng)菜單ID與工具欄按鈕ID一樣時(shí)就會(huì)顯示位圖
4、在CChildView的析構(gòu)函數(shù)中加入代碼:m_menu.DestroyMenu(); //釋放資源
5、在CChildView類中加入WM_INITMENUPOPUP消息,并在其實(shí)現(xiàn)函數(shù)中加入代碼:
if(!bSysMenu)
m_menu.InitPopupMenu(pPopupMenu,IDR_MAINFRAME,m_pToolBar);
6、在CChildView類中加入WM_CONTEXTMENU消息,并在其實(shí)現(xiàn)函數(shù)中加入彈出菜單的代碼: m_menu.TrackPopupMenu(TPM_LEFTALIGN TPM_RIGHTBUTTON,point.x,point.y,this);
好了!介紹完了。
大家可以在適當(dāng)?shù)牡胤剑ū热鏑MainFrame:OnCreate)中加入:m_menu.SetHighLightColor(RGB(0,0,127));
m_menu.SetTextColor(RGB(0,0,0));
m_menu.SetBackColor(RGB(143,167,207));
來設(shè)置菜單顏色,怎么樣:) 歡迎大家多提建議!