程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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