当应用程序的窗口过程将WM_RBUTTONUP或WM_NCRBUTTONUP消息传递给DefWindowProc功能时,将生成WM_CONTEXTMENU消息。应用程序可以处理此消息以显示适合其屏幕特定部分的快捷菜单。如果应用程序不显示快捷菜单,则应将消息传递给DefWindowProc以进行默认处理。
以下是WM_CONTEXTMENU消息处理的示例,因为它可能出现在应用程序的窗口过程中。【lParam的】参数的低阶和高位字指定鼠标右键释放时的屏幕坐标。如果应用程序定义的OnContextMenu函数显示上下文菜单,则返回TRUE,否则返回FALSE。
case WM_CONTEXTMENU:
如果(!OnContextMenu(HWND,LOWORD(IPARAM),HIWORD(IPARAM)))nl
return DefWindowProc(hwnd, uMsg, wParam, lParam);
break;
如果指定的鼠标位置在窗口的客户区内,以下应用程序定义的OnContextMenu函数将显示快捷菜单。更复杂的功能可能会显示几个不同菜单中的一个,具体取决于指定的客户区域的哪一部分。要实际显示快捷菜单,此示例调用名为DisplayContextMenu的应用程序定义函数。有关此函数的说明,请参阅显示快捷菜单.
BOOL WINAPI OnContextMenu(HWND hwnd, int x, int y)
{
RECT rc; //窗口的客户区
POINT pt = { x, y }; //鼠标点击的位置
//获取客户区域的边界矩形。
GetClientRect(hwnd, &rc);
//将鼠标位置转换为客户端坐标。
ScreenToClient(hwnd, &pt);
//如果位置在客户区域,则显示a
//快捷菜单。
if(PtInRect(& rc,pt)){
ClientToScreen(hwnd, &pt);
DisplayContextMenu(hwnd, pt);
return TRUE;
}
//如果没有菜单显示,返回FALSE。
return FALSE;
}