類WindowXp 開始菜單到現在基本上是完美實現,在功能上基本和WindowXp 與Vista 操作系統的開始菜單一樣,界面當然漂亮,通過編程能實現風格多樣,具有個性化的功能菜單。為了方便使用,本人對其進行了封裝,庫名曰:完美類WindowXp 開始菜單。
1、完美類WindowXp 開始菜單(CYisongStartMenu)有如下主要特點:
a. 在C++環境實現,界面風格可實現自定義;
b. 不僅適用Mouse 操作,還支持響應方向按鍵,快捷鍵功能;
c. 可增加和刪除菜單中的子項;
d. 可顯示Left Bar 並定義其風格;
e. 可自定義焦點亮條的風格;
f. 可設置菜單子項為Check Option 風格
2、完美類WindowXp 開始菜單的用途:
a. 可實現WindwXp 的兩種菜單,經典菜單和分組菜單,非常適在大型應軟件。象QQ 的 主菜單就是其中之一的分組菜單
b. 托盤菜單、右鍵快捷菜單等應用。
一、編程指南
1.文件說明
類文件:YisongStartMenu.dll YisongStartMenu .lib (開始菜單庫)
其它文件:MyStartMenuLib.h,MyStartMenu.h ,CmyToolTipCtrl.h
2.CYisongStartMenu 用法
a. 先把上述文件拷貝到工程目錄下
b. #include MyStartMenuLib.h ,只要把MyStartMenuLib.h 文件包括到工程文件中就OK
c. 定義一變量:CYisongStartMenu m_StartMenu;
d. 在.cpp 文件中現實代碼
//主菜單初始化過程 _TextInfo textInfo; //定義主菜頂部文本信息結構 m_StartMenu.GetUserPaneTextInfo(textInfo);//獲取文本信息的初始屬性 textInfo.clrShadow = GetSysColor(COLOR_BTNSHADOW);//設文本信息的主要屬性 textInfo.nOffsetX = 1; textInfo.nOffsetY = 1; textInfo.logFontUserText.lfItalic = TRUE; m_StartMenu.SetUserPaneTextInfo(textInfo); //使設置有效 m_StartMenu.SetUserPaneText(_T("WindowXp Menu")); //設置主菜頂部標題 m_StartMenu.SetUserPaneIcon(IDI_ICON_QQ,CSize(48,48)); //設置主菜頂部顯示圖標 //設置主菜頂部顯示圖形 m_StartMenu.GetUserBitmap(0,".\\skin\\1.bmp"); m_StartMenu.GetUserBitmap(1,".\\skin\\2.bmp"); m_StartMenu.GetUserBitmap(2,".\\skin\\3.bmp"); //實現菜單菜項的添加(左邊主程序項的添加) m_StartMenu.AppendProgItem(_T("Internet/nInternet Explorer"), ID_PROGLIST_IE,0, MENU_DEFAULT,IDI_ICON_IE,NULL,_T("聯接國際互際聯網頁")); m_StartMenu.AppendProgItem(….) …. m_StartMenu.AppendProgItem(_T("所有程序"),IDR_MENU_TEST,0, MENU_BOTTOM|MENU_POPUP,0,NULL,NULL,&m_wndSubMenu); // m_wndSubMenu 為“所有程序”菜單項的下拉子菜單 //實現菜單項的添加(分組菜單右邊的菜單子項的添加) //和上面方法一樣,只不過是用函數AppendProgItem() m_StartMenu. AppendPlaceItem(_T("My Documents"), ID_PLACELIST_MYDOCUMENT,0,MENU_DEFAULT, IDI_ICON_MYDOCUMENT); ….. m_StartMenu. AppendPlaceItem(….); //設置菜單子項文本顏色, PLACELIST_TYPE 指Place List 子項顏色 //PROGLIST_TYPE指Prog List(左邊列表)子項顏色 m_StartMenu.SetItemTextColor(PLACELIST_TYPE,RGB(0,255,0)); //設置子項有焦點時,其顯示的亮條圖形,不設置亮條為藍色 m_StartMenu.SetItemFoucsBitmap(PLACELIST_TYPE,".\\skin\\OverFoucs.bmp") //設置菜單底部屬性 CImageList lst; lst.Create(IDB_STARTPANE_BUTTONS,24,3,RGB(192,192,192)); HICON hIconTurnOff = lst.ExtractIcon(2); m_StartMenu.AppendBottomItem(_T("Turn Off Computer"), ID_BOTTOMBAR_TURNOFFCOMPUTER, 0,MENU_NORMAL,0,hIconTurnOff); HICON hIconLogOff = lst.ExtractIcon(1); m_StartMenu.AppendBottomItem(_T("Log Off"),ID_BOTTOMBAR_LOGOFF, 0,MENU_NORMAL,0,hIconLogOff); //設置菜單底部顯的背景圖形。 m_StartMenu.GetBottomBarBitmap(0,".\\skin\\1.bmp"); m_StartMenu.GetBottomBarBitmap(1,".\\skin\\2.bmp"); m_StartMenu.GetBottomBarBitmap(2,".\\skin\\3.bmp"); …..
e. 顯示菜單方法
//空口中在某點(x,y)處顯示,作為m_hWnd 的子窗口
m_StartMenu.TrackPopPane(point.x, point.y, m_hWnd, 0);
f. 響應菜單菜單命令
在用AppendPlaceItem()或AppendProgItem()、AppendBottomItem()添加菜單子項時它們第二個參數為菜單項的ID。在響應每個子項mouse 單擊事件時,會向菜單其父窗口發送WM_COMMAND 消息,
::SendMessage(m_hWndParent,WM_COMMAND,m_pCurrentItem->uID,0)
所以只要在主窗口為每個菜單項映謝消息ON_COMMAND 的函數函行了,方法是在cpp 文件中找到消息息映射處( 在BEGIN_MESSAGE_MAP(CWindowsXPMenuDlg,
CDialog) 和END_MESSAGE_MAP()之間)。添加如下代碼:
ON_COMMAND(ID_MENUITEM,OnFunc)
在.h 頭文件對OnFunc()函數聲明為消息函數:
afx_msg void OnFunc();
在OnFunc()函數中實現菜單項的命令的功能
二.主要功能接口函數的說明
1.函數名:AppendProgItem()
功能:添加主程序功能菜單項
原型及參數說明:
void AppendProgItem(LPCTSTR szItemName,
szItemName:菜單項文本標題
UINT uID,
ULONG ulData,
UINT uFlags,
UINT uIconResID,
HICON hIcon = NULL,
LPCSTR szTooltip=_T(""),
CYisongStartMenu* pSubMenu = NULL);
uID:菜單項ID 標識
ulData: 保留
uFlags: 菜單風格定義,其值可為下列值或組合
AppendProgItem(_T(""),0,0,MENU_SEPARATOR,0);
或AppendPlaceItem(_T(""),0,0,MENU_SEPARATOR,0);
與本功能相同用的函數還有AppendPlaceItem(),用法上完全一樣。
2.函數名:SetProgItemBackColor()
功 能:設置菜單列表背景顏色
原型及參數說明:
void SetProgItemBackColor(COLORREF clrLeftTop,
COLORREF clrRightBottom,
bool bValid)
clrLeftTop:左上角的顏色
clrRightBottom:右下角結束處 顏色
bValid:布爾型變量,TRUE,表示立即設置生效。
說明:SetProgItemBackColor()函數的用法及功能與本函是一樣的,請參照此用法。
3.函數名:SetItemTextColor(ITEM_TYPE nType,COLORREF clrText)
功 能:設置菜單文本顏色
原型及參數說明:
void SetItemTextColor(ITEM_TYPE nType,COLORREF clrText)
nType :ITEM_TYPE 枚舉類型的數參
enum ITEM_TYPE
{
PROGLIST_TYPE, //指Program 列表菜單
PLACELIST_TYPE, //指Place 列表菜單
BOTTOMBAR_TYPE, //菜單底部
}
clrText:本文的顏色
設置 Program 列表菜單項的文本顏色為 紅色的方法如下:
Exp.: SetItemTextColor(PROGLIST_TYPE, RGB(255,0,0));
注意:一般在菜單初始完成後調用該函數來設置菜單項的文本顏色。
4.函數名:GetBottomBarBitmap()
功 能:設置菜單底部背景圖象
原型及參數說明:void GetBottomBarBitmap(int nMode,LPTSTR szFile))
nMode :指出顯示方式
szFile : 圖像文件及路徑。
與些函數功能相同的還有GetUserBitmap(int nMode,LPTSTR szFile)
5.函數名:SetAsSubMenu()
功 能:設置菜單為彈出(子)菜單
原型及參數說明:void SetAsSubMenu(BOOL bSubmenu)
bSubmenu =TRUE 時,表示為彈出(子)菜單。如上圖的 TEST 菜單
6.函數名:SetItemFoucsBitmap(ITEM_TYPE nType,LPTSTR strFile)
功 能: 設置菜單項的焦點高亮顯示方式
原型及參數說明:void SetItemFoucsBitmap(ITEM_TYPE nType,LPTSTR strFile)
nType:參考上面介始
strFile:焦點高亮顯示圖形,為NULL 則顯示默認的高亮條
注意:一般在菜單初始完成後調用該函數
可設定不同的焦點亮條風格,上圖顯示兩種亮條不同風格的焦點亮條。當亮條風格不能滿足你的要求時,還可設定自已喜歡的圖形作為焦點亮條。對亮條圖形任意盡寸大小都適合。也可看到上圖下拉菜單的Left Bar 風格。可以說,完美類WindowXp 開始菜單是一款用C++實現的非常完美的菜單,實現了多風格,操作上也很友好地支持按鍵的操作,功能基本上能滿足大多應用軟件的要求。當然,本開始菜的實現是相當復雜的,存在的問題也是意料之中的,希望大家批評指正並提出保貴意見。
本人的聯系方式QQ 號:34544052 郵箱:[email protected]