感觉这些没啥可写的,就把两个合成一个吧,第一段代码是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);
第二段代码只是两个函数吧
再加一些内容吧:
GetSystemMenu
函数功能:该函数允许应用程序为复制或修改而访问窗口菜单(系统菜单或控制菜单)。函数原型: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..."));