菜单背景色设置,主要用到的函数SetMenuInfo
函数原型:BOOL SetMenultemlnfo(HMENU hMenu,UINT uitem,BOOL fByPosition,LPMENUITEMINFO lpmii);
参数:
hMenu:包含菜单项的菜单的句柄。
ultem:将被修改的菜单项的标识符或位置。此参数的含义由参数fByPosition确定。
FByPosition:用于指定参数ultem的含义的值。如果此参数值为FALSE,则参数ultem是菜单项的标识符,否则,表示菜单项的位置。
lpmii:指向结构MENUITEMINFO的指针。该结构含有菜单项的信息,并且.指定将被修改的菜单项的属性。
返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。
菜单位图加载,主要用到的函数SetMenuItemBitmaps。
CMenu::SetMenuItemBitmaps
BOOLSetMenuItemBitmaps
(
UINT
nPosition
,
UINT
nFlags
,
const
CBitmap*
pBmpUnchecked
,
const
CBitmap*
pBmpChecked
);
返回值:如果调用成功会返回非零值,否则为0.
参数:第一个参数nPosition的取值由第二个参数nFlags的取值决定。如果第二个参数的取值为MF_BYPOSITION,即使用位置索引,那么第一个参数为菜单项位置索引;如果第二个参数的取值为MF_BYCOMMAND,那么第一个参数为菜单项标示,应该使用该菜单项的ID。后两个参数都是CBitmap类的指针,用来设置与菜单项关联的两个位图,其中第三个参数表示该菜单项未被选中时的位图,第四个参数表示该菜单项被选中之后的显示的位图。
主要代码如下:
1 // 菜单数组 2 const int g_MenuIDArray[] = 3 { 4 ID_RMENU_RUN, 5 ID_RMENU_ADD, 6 ID_RMENU_REMOVE, 7 ID_RMENU_SEEKFILE, 8 ID_TMENU_VIEW, 9 ID_TMENU_LOGOUT 10 }; 11 12 // 位图数组 13 const int g_BMPIDArray[] = 14 { 15 IDB_BITMAP_RUN, 16 IDB_BITMAP_ADD, 17 IDB_BITMAP_REMOVE, 18 IDB_BITMAP_SEEKFILE, 19 IDB_BITMAP_VIEW, 20 IDB_BITMAP_LOGOUT 21 };
1 // 初始化cmdID和bitmap的关系 2 void CToolBoxDlg::InitBMPMap() 3 { 4 for (int i = 0; i < sizeof(g_MenuIDArray)/sizeof(g_MenuIDArray[0]); i++) 5 { 6 CBitmap * bmp = new CBitmap; 7 bmp->LoadBitmap(g_BMPIDArray[i]); 8 m_bmpMap[g_MenuIDArray[i]] = bmp; 9 } 10 }
1 // 设置菜单背景 2 void CToolBoxDlg::SetMenuBkColor(CMenu * pMenu) 3 { 4 if (NULL == pMenu) 5 { 6 return; 7 } 8 9 MENUINFO menuInfo; 10 memset(&menuInfo, 0, sizeof(menuInfo)); 11 menuInfo.cbSize = sizeof(menuInfo); 12 menuInfo.hbrBack = m_brush; 13 menuInfo.fMask = MIM_BACKGROUND; 14 ::SetMenuInfo(pMenu->m_hMenu, &menuInfo); 15 } 16 17 // 加载菜单位图 18 void CToolBoxDlg::SetMenuBMP(CMenu * pMenu) 19 { 20 for (UINT i = 0; i < pMenu->GetMenuItemCount(); i++) 21 { 22 int nMenuId = pMenu->GetMenuItemID(i); 23 24 if (0 < nMenuId) 25 { 26 pMenu->SetMenuItemBitmaps(nMenuId, MF_BYCOMMAND, 27 m_bmpMap[nMenuId], m_bmpMap[nMenuId]); 28 } 29 } 30 }
1 // 设置菜单背景色和位图 2 void CToolBoxDlg::SetMenuBKInfo(CMenu * pMenu) 3 { 4 SetMenuBkColor(pMenu); 5 SetMenuBMP(pMenu); 6 }
1 // 右键列表框,弹出右键菜单 2 void CToolBoxDlg::OnNMRClickListToolbox(NMHDR *pNMHDR, LRESULT *pResult) 3 { 4 LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)(pNMHDR); 5 6 CPoint pt; 7 8 GetCursorPos(&pt); 9 10 CMenu menu; 11 menu.LoadMenu(IDR_MENU_RIGHT); 12 13 CMenu *pPopup = menu.GetSubMenu(0); 14 15 SetMenuBKInfo(pPopup); 16 17 int nSelectIndex = pNMItemActivate->iItem; 18 19 if (Not_Find != nSelectIndex) 20 { 21 pPopup->EnableMenuItem(ID_RMENU_RUN, MF_BYCOMMAND | MF_ENABLED); 22 pPopup->EnableMenuItem(ID_RMENU_REMOVE, MF_BYCOMMAND | MF_ENABLED); 23 pPopup->EnableMenuItem(ID_RMENU_SEEKFILE, MF_BYCOMMAND | MF_ENABLED); 24 } 25 else 26 { 27 pPopup->EnableMenuItem(ID_RMENU_RUN, MF_BYCOMMAND | MF_DISABLED); 28 pPopup->EnableMenuItem(ID_RMENU_REMOVE, MF_BYCOMMAND | MF_DISABLED); 29 pPopup->EnableMenuItem(ID_RMENU_SEEKFILE, MF_BYCOMMAND | MF_DISABLED); 30 } 31 32 pPopup->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this); 33 34 *pResult = 0; 35 }