wndClass.lpszMenuName = MAKEINTRESOURCE(IDR_ MENU1);
HMENU hMenu; hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_NEW_MENU)); hwnd = CreateWindow(szAppName,"菜单示例", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,hMenu,hInstance,NULL) ;
//动态菜单: HMENU hMenu = nullptr; hMenu = CreateMenu();//创建了一个新菜单(空菜单) HMENU h_1 = CreateMenu(); AppendMenu(h_1, //菜单句柄,指明在哪一个菜单的尾部进行追加 0, //菜单风格 10087, //菜单项id _T("新建(&N)\t Ctrl+N"));//菜单项名 AppendMenu(h_1, MF_SEPARATOR, 0, _T("-")); AppendMenu(h_1, 0, 10088, _T("打开(&O)\t Ctrl+O")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)h_1, _T("文件(&F)")); HMENU h_2 = CreateMenu(); //第2个参数为坐标,该参数会受到第3个参数(MF_BYCOMMAND or MF_BYPOSITION)的影响 InsertMenu(h_2, 0, MF_BYPOSITION, 10089, _T("a")); InsertMenu(h_2, 0, MF_BYPOSITION, 10090, _T("b")); InsertMenu(h_2, 10089, MF_BYCOMMAND, 10091,_T("c")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)h_2, _T("abc")); //使菜单项是否变灰或是否激活 EnableMenuItem(h_1, 10087, MF_GRAYED); EnableMenuItem(hMenu, 10087, MF_ENABLED); EnableMenuItem(h_1, 0, MF_DISABLED | MF_BYPOSITION); SetMenu(hWnd, hMenu);//更新菜单,在窗口显示更新后修改要加
WM_COMMAND消息响应。
在资源编辑器中编辑好新的右键菜单
初始化加载,可以在WM_CREATE内或者在主消息循环之前加载。
//g_hRMemu是在外部创建的全局变量 g_hRMemu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));
在WM_RBUTTONDOWN内可以响应
//鼠标 POINT pt; pt.x = LOWORD(lParam);//低两位是x坐标 pt.y = HIWORD(lParam);//高两位是y坐标 //把客户区坐标转为屏幕坐标(否则是基于整个显示器屏幕) ClientToScreen(hWnd, &pt); //以屏幕位置确定坐标位置 GetCursorPos(&pt); HMENU tempMenu = GetSubMenu(g_hRMemu, 1);//把g_hRMenu里面的0列表示的菜单给到tempMenu //弹出右键菜单 TrackPopupMenu(tempMenu,//哪一个菜单 TPM_LEFTALIGN | TPM_TOPALIGN,//菜单风格,对齐方式(基于鼠标左上对齐) pt.x, pt.y,//鼠标坐标,菜单在哪个坐标开始显示 0, hWnd,//窗口句柄 nullptr);
静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。
动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。