MFC-CMenu用法摘要

#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;
}

你可能感兴趣的:(MFC-CMenu用法摘要)