以前還是菜鳥時就覺得QQ的菜單做得很漂亮,想著自已的程序如果有那種菜單多好。
現在積累了一定的知識,就自已設計了一個類似的菜單控件類。並把它發表出來供大家使用和參考,難免有不足的地方請高手不吝賜教!
菜單效果如下:
一、CMenuEx菜單類主要接口函數:
1、void InitMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar);
說明:這是最主要的一個接口。如果要改變主窗口的菜單則應在主窗口的OnInitMenu(CMenu *pMenu)中調用該函數(如:m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar)),當然主窗口必須要有工具欄,才會產生菜單項位圖。最後還必須重載主窗口的OnMeasureItem()和OnDrawItem()。並在兩個函數中分別
調用菜單類的另外兩個接口DrawItem()和MeasureItem();
2、void SetHighLightColor(COLORREF crColor);
3、void SetBackColor(COLORREF);
4、void SetTextColor(COLORREF);
以上三個接口應該不用再說明 。
QQ的菜單采用的顏色是
SELECTTEXT_COLOR RGB(0,0,127)
TEXT_COLOR RGB(0,0,0)
BK_COLOR RGB(143,167,207) 效果不錯
5、void SetImageLeft(UINT idBmpLeft)
說明:這也是個重要的接口。要實現縱向位圖(像“開始”菜單)。可以在適當的地方調用該函數。參數當然是位圖的ID值。注意選擇位圖時要選好看一點的哦!要記得高寬的比例。
6、void InitPopupMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar)
與InitMenu不同的是:InitMenu並不修改第一級菜單為自繪風格,而
該函數有包括第一級菜單.
但必須注意:該類的任一實例都只能調用這兩個函數中的一個,不能一同使用!!!
二、CMenuEx類的具體使用步驟:
2.1 用CMenuEx類加載主窗口菜單的具體步驟:
1、添加CMenuEx成員變量
CMenuEx m_menu
2、CMainFrame類添加WM_INITMENU消息,並在實現函數中加入代碼:
m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar);
IDR_MAINFRAME是工具欄資源ID,m_wndToolBar是工具欄對象
3、CMainFrame類添加WM_DRAWITEM和WM_MEASUREITEM消息,並在實現函數分加入:
if(!nIDCtl) m_menu.DrawItem(lpDrawItemStruct);
if(!nIDCtl) m_menu.MeasureItem(lpMeasureItemStruct);
只須這三步就大功造成了!
但是有時你會發現菜單的位圖錯位了,這不是程序的錯。
這是因為“工具欄位圖”的個數與“工具欄按鈕個數”不符,
你只需把不用的位圖刪掉就可以,或者添加對應的菜單項,反正使這兩個數目一致就對了
4、如果你想要讓你的菜單擁有“縱向位圖”(像“開始”菜單),就必須在CMainFrame在OnCreate()中加入:
m_menu.SetImageLeft(IDB_BITMAP1);//IDB_BITMAP1是指定位圖
2.2 用CMenuEx類加載彈出菜單的具體步驟:
1、在CChildView類中加入成員變量 CMenuEx m_menu和CToolBar *m_pToolBar
為什麼要加入m_pToolBar,這裡做一下說明:
因為在CMenuEx的接口函數InitPopupMenu()中需要工具欄對象指針,而工具欄對象又偏偏是CMainFrame類的成員
所以設此指針變量指向工具欄對象
2、給CChildView類的成員m_pToolBar賦值。
當CView派生類由不得CxxxxDocTemplate產生時,賦值的地方比較特殊
請在CxxxWinApp類中的InitInstance()的最後加入代碼:
CMainFrame *pFrame=(CMainFrame *)m_pMainWnd;
CChildView *pView=(CChildView *)pFrame->GetActiveView();
pView->m_pToolBar=&(pFrame->m_wndToolBar);//注意:原m_wndToolBar是私有變量,要改成public的哦!
當CView派生類是CMainFrame類的成員變量時,就很簡單,直接在OnCreate()中設置
3、在CChildView的構造函數中加入設置彈出菜單的代碼
m_menu.CreatePopupMenu();
m_menu.AppendMenu(0,ID_EDIT_UNDO,"撤消");
m_menu.AppendMenu(MF_SEPARATOR,0);
m_menu.AppendMenu(0,ID_EDIT_COPY,"復制");
m_menu.AppendMenu(0,ID_EDIT_CUT,"剪切");
m_menu.AppendMenu(0,ID_EDIT_PASTE,"粘貼");//當菜單ID與工具欄按鈕ID一樣時就會顯示位圖
4、在CChildView的析構函數中加入代碼:
m_menu.DestroyMenu(); //釋放資源
5、在CChildView類中加入WM_INITMENUPOPUP消息,並在其實現函數中加入代碼:
if(!bSysMenu)
m_menu.InitPopupMenu(pPopupMenu,IDR_MAINFRAME,m_pToolBar);
6、在CChildView類中加入WM_CONTEXTMENU消息,並在其實現函數中加入彈出菜單的代碼:
m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this);
好了!介紹完了。
大家可以在適當的地方(比如CMainFrame:OnCreate)中加入:
m_menu.SetHighLightColor(RGB(0,0,127));
m_menu.SetTextColor(RGB(0,0,0));
m_menu.SetBackColor(RGB(143,167,207));
來設置菜單顏色,怎麼樣:) 歡迎大家多提建議!