程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 一種漂亮的自繪菜單

一種漂亮的自繪菜單

編輯:關於VC++

以前還是菜鳥時就覺得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));

來設置菜單顏色,怎麼樣:) 歡迎大家多提建議!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved