感觉这些没啥可写的,就把两个合成一个吧,第一段代码是MENUDEMO中的部分,第二段是POPMENU。
switch(message) { case WM_COMMAND: //获取菜单句柄 hMenu=GetMenu(hwnd); //LOWORD(wParam)是菜单ID switch(LOWORD(wParam)) { case IDM_FILE_NEW: case IDM_FILE_OPEN: case IDM_FILE_SAVE: case IDM_FILE_SAVE_AS: MessageBeep(0); break; case IDM_APP_EXIT: SendMessage(hwnd,WM_CLOSE,0,0); return 0; case IDM_EDIT_UNDO: case IDM_EDIT_CUT: case IDM_EDIT_COPY: case IDM_EDIT_PASTE: case IDM_EDIT_CLEAR: MessageBeep(0); return 0; case IDM_BKGND_WHITE: case IDM_BKGND_LTGRAY: case IDM_BKGND_GRAY: case IDM_BKGND_DKGRAY: case IDM_BKGND_BLACK: //这个是设置选定状态取消 CheckMenuItem(hMenu,iSelection,MF_UNCHECKED); //获取菜单ID iSelection=LOWORD(wParam); //设置为选定状态 CheckMenuItem(hMenu,wParam,MF_CHECKED); //替换背景刷子 SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(idColor[LOWORD(wParam)-IDM_BKGND_WHITE])); //刷新 InvalidateRect(hwnd,NULL,TRUE); return 0; case IDM_TIMER_START: if(SetTimer(hwnd,ID_TIMER,1000,NULL)) { //设置菜单id子项的状态 EnableMenuItem(hMenu,IDM_TIMER_START,MF_GRAYED); EnableMenuItem(hMenu,IDM_TIMER_STOP,MF_ENABLED); } return 0;
point.x=LOWORD(lParam); point.y=HIWORD(lParam); //窗口坐标转屏幕坐标 ClientToScreen(hwnd,&point); //指定位置显示菜单,坐标为屏幕坐标 TrackPopupMenu(hMenu,TPM_RIGHTBUTTON,point.x,point.y,0,hwnd,NULL);
再加一些内容吧:
函数原型:HMENU GetSystemMenu(HWND hWnd,BOOL bRevert);
参数: hWnd:拥有窗口菜单拷贝的窗口的句柄。
bRevert:指定将执行的操作。如果此参数为FALSE,GetSystemMenu返回当前使用窗口菜单的拷贝的句柄。
该拷贝初始时与窗口菜单相同,但可以被修改。
如果此参数为TRUE,GetSystemMenu重置窗口菜单到缺省状态。如果存在先前的窗口菜单,将被销毁。
hMenu=GetSystemMenu(hwnd,FALSE); //画一条水平区分线 AppendMenu(hMenu,MF_SEPARATOR,0,NULL); //动态添加子项 AppendMenu(hMenu,MF_STRING,IDM_SYS_ABOUT,TEXT("About..."));