工具管理菜单位图加载

菜单背景色设置,主要用到的函数SetMenuInfo

函数原型:BOOL SetMenultemlnfo(HMENU hMenu,UINT uitem,BOOL fByPosition,LPMENUITEMINFO lpmii);
参数:
hMenu:包含菜单项的菜单的句柄。
ultem:将被修改的菜单项的标识符或位置。此参数的含义由参数fByPosition确定。
FByPosition:用于指定参数ultem的含义的值。如果此参数值为FALSE,则参数ultem是菜单项的标识符,否则,表示菜单项的位置。
lpmii:指向结构MENUITEMINFO的指针。该结构含有菜单项的信息,并且.指定将被修改的菜单项的属性。
返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。
 

菜单位图加载,主要用到的函数SetMenuItemBitmaps

CMenu::SetMenuItemBitmaps
BOOLSetMenuItemBitmaps(UINTnPosition,UINTnFlags,constCBitmap*pBmpUnchecked,constCBitmap*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 }
高山流水,海纳百川!
原文地址:https://www.cnblogs.com/ahcc08/p/4033567.html