類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 郵箱:song_0962@sina.com
