#include "windows.h" int main(int argc, char const *argv[]) { // 系统工具栏菜单 CMenu menu; menu.LoadMenuW(IDR_MENU1);//加载资源中的菜单 SetMenu(&menu); // 将该菜单设置到主窗口 menu.Detach(); // 将菜单句柄释放,防止CMenu析构时被销毁 // 给菜单加上左图标 CMenu* pmenu = GetMenu(); // 获取系统菜单 CMenu * subMenu = pmenu->GetSubMenu(0); // 获取该菜单下的子菜单 CBitmap bmp,bmp2; bmp.LoadBitmapW(IDB_BITMAP1); bmp2.LoadBitmapW(IDB_BITMAP2); subMenu->SetMenuItemBitmaps(1, MF_BYPOSITION, &bmp, &bmp); // 根据索引设置图标 UINT itemID = subMenu->GetMenuItemID(0); // 根据索引获取菜单的id CString *pText = new CString; subMenu->GetMenuString(0, *pText, MF_BYPOSITION); // 根据索引获取菜单上的文字 subMenu->SetMenuItemBitmaps(itemID, MF_BYCOMMAND, &bmp2, &bmp2); // 根据ID设置图标 bmp.Detach(); bmp2.Detach(); // 给菜单加上背景图片 CBrush bs; bs.CreatePatternBrush(&bmp); MENUINFO menuif; memset(&menuif,0,sizeof(MENUINFO)); menuif.cbSize = sizeof(MENUINFO); menuif.fMask = MIM_BACKGROUND; menuif.hbrBack = (HBRUSH)bs; // 设置画刷,必须detach,不然没有句柄 subMenu->SetMenuInfo(&menuif); bs.Detach(); // 释放画刷句柄,防止CBrush析构时销毁句柄 // 鼠标点击生成动态菜单 CMenu * menu = GetMenu(); CMenu * subMenu = menu->GetSubMenu(0); ClientToScreen(&point); // 客户端坐标转化为屏幕坐标 subMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_VERTICAL,point.x,point.y,this); menu->Detach(); // 手动生成菜单 CMenu menu; menu.CreateMenu(); CMenu popmenu; popmenu.CreatePopupMenu(); popmenu.AppendMenuW(MF_STRING, 1001, _T("新建"));//表明添加的是一个不具有弹出属性的菜单项 popmenu.AppendMenuW(MF_STRING, 1002, _T("打开")); popmenu.AppendMenuW(MF_SEPARATOR); //表明添加的是一个分割菜单项 popmenu.AppendMenuW(MF_STRING, 1001, _T("退出")); menu.AppendMenuW(MF_POPUP,(UINT)popmenu.m_hMenu,_T("文件")); // 表明添加的是一个子菜单 SetMenu(&menu); menu.Detach(); popmenu.Detach(); // 删除菜单 menu.DeleteMenu(0,MF_BYPOSITION); // 自绘菜单,需要重写菜单类,并继承CMenu return 0; }