本节中的示例包含来自应用程序的代码部分,它创建并显示快捷菜单,使用户可以设置字体和字体属性。当用户单击鼠标左键时,该应用程序将在其主窗口的客户区域中显示该菜单。
以下是应用程序资源定义文件中提供的快捷菜单的菜单模板。
弹出菜单菜单
BEGIN
POPUP“虚拟弹出”
BEGIN
POPUP“字体”
BEGIN
MENUITEM“快递”,IDM_FONT_COURIER
MENUITEM“Times Roman”,IDM_FONT_TMSRMN
MENUITEM“Swiss”,IDM_FONT_SWISS
MENUITEM“Helvetica”,IDM_FONT_HELV
MENUITEM“老英语”,IDM_FONT_OLDENG
END
POPUP“大小”
BEGIN
MENUITEM "7", IDM_SIZE_7
MENUITEM "8", IDM_SIZE_8
MENUITEM "9", IDM_SIZE_9
MENUITEM "10", IDM_SIZE_10
MENUITEM "11", IDM_SIZE_11
MENUITEM "12", IDM_SIZE_12
MENUITEM "14", IDM_SIZE_14
END
POPUP“样式”
BEGIN
MENUITEM“Bold”,IDM_STYLE_BOLD
MENUITEM“斜体”,IDM_STYLE_ITALIC
MENUITEM“Strike Out”,IDM_STYLE_SO
MENUITEM“上标”,IDM_STYLE_SUPER
MENUITEM“下标”,IDM_STYLE_SUB
END
END
END
以下示例给出了用于创建和显示快捷菜单的窗口过程和支持功能。
LRESULT APIENTRY MenuWndProc(hwnd,uMsg,wParam,lParam)en
HWND hwnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
RECT rc; //客户区
POINT pt; //鼠标点击的位置
开关(uMsg){
case WM_LBUTTONDOWN:
//获取客户区域的边界矩形。
GetClientRect(hwnd, (LPRECT) &rc);
//获取鼠标点击的客户端坐标。
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
//如果鼠标点击发生在客户端内
//区域,执行应用程序定义的函数
//显示快捷菜单。
if(PtInRect((LPRECT)& rc,pt))
HandlePopupMenu(hwnd, pt);
break;
.
. //处理其他窗口消息
.
默认:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return NULL;
}
VOID APIENTRY HandlePopupMenu(hwnd,pt)
HWND hwnd;
POINT pt;
{
HMENU hmenu; //菜单模板
HMENU hmenuTrackPopup; //快捷菜单
//加载包含快捷菜单的菜单模板
//应用程序的资源。
hmenu = LoadMenu(hinst, "PopupMenu");
if (hmenu == NULL)
return;
//获取菜单模板中的第一个快捷菜单。这就是
// TrackPopupMenu显示的菜单。
hmenuTrackPopup = GetSubMenu(hmenu, 0);
// TrackPopup使用屏幕坐标,因此转换
//坐标的鼠标点击屏幕坐标。
ClientToScreen(hwnd, (LPPOINT) &pt);
//绘制并跟踪快捷菜单。
TrackPopupMenu(hmenuTrackPopup,TPM_LEFTALIGN | TPM_LEFTBUTTON,
pt.x, pt.y, 0, hwnd, NULL);
//销毁菜单
DestroyMenu(hmenu);
}