Last week
we looked at menu drag/drop.
Another little-used menu feature added in Windows 2000 is
the ability to show context menus on menus.
The message is WM_MENURBUTTONUP
and the flag is TPM_RECURSE
.
Let’s demonstrate with a simple program.
Start with
the scratch program,
and add
the
MoveMenuItem
function
just so our context menu can do something.
// resource header file #define IDM_MAIN 1 #define IDM_POPUP 2 #define IDC_MOVEUP 200 #define IDC_MOVEDOWN 201 // resource file 1 MENU PRELOAD BEGIN POPUP "&Test" BEGIN MENUITEM "&Red", 100 MENUITEM "&Orange", 101 MENUITEM "&Yellow", 102 MENUITEM "&Green", 103 MENUITEM "&Blue", 104 MENUITEM "&Violet", 105 END END 2 MENU PRELOAD BEGIN POPUP "" BEGIN MENUITEM "Move &Up", IDC_MOVEUP MENUITEM "Move &Down", IDC_MOVEDOWN MENUITEM SEPARATOR MENUITEM "&Cancel", IDCANCEL END END // scratch.cpp #define HANDLE_WM_MENURBUTTONUP(hwnd, wParam, lParam, fn) \ ((fn)((hwnd), (UINT)(wParam), (HMENU)(lParam)), 0L) void OnMenuRButtonUp(HWND hwnd, UINT uPos, HMENU hmenu) { if (hmenu == GetSubMenu(GetMenu(hwnd), 0)) { HMENU hmenuPopup = LoadMenu(g_hinst, MAKEINTRESOURCE(IDM_POPUP)); if (hmenuPopup) { if (uPos == 0) { EnableMenuItem(hmenuPopup, IDC_MOVEUP, MF_DISABLED | MF_GRAYED); } if (uPos == GetMenuItemCount(hmenu) - 1) { EnableMenuItem(hmenuPopup, IDC_MOVEDOWN, MF_DISABLED | MF_GRAYED); } DWORD dwPos = GetMessagePos(); UINT idCmd = TrackPopupMenuEx(GetSubMenu(hmenuPopup, 0), TPM_RECURSE | TPM_RETURNCMD, GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos), hwnd, NULL); switch (idCmd) { case IDC_MOVEUP: MoveMenuItem(hmenu, uPos, uPos - 1); break; case IDC_MOVEDOWN: MoveMenuItem(hmenu, uPos, uPos + 2); break; } DestroyMenu(hmenuPopup); } } } HANDLE_MSG(hwnd, WM_MENURBUTTONUP, OnMenuRButtonUp); // InitApp function wc.lpszMenuName = MAKEINTRESOURCE(IDM_MAIN);
When we receive the
WM_MENURBUTTONUP
message
and confirm that the menu is the one we support,
we create the popup menu and display it at the mouse
location (obtained via GetMessagePos
)
with the TPM_RECURSE
flag,
indicating that this is a pop-up menu for a pop-up menu.
(We also use TPM_RETURNCMD
,
but that’s nothing new.)
If the user chose to move the item up or down, we move it up or down.
That’s all. There really isn’t much here, but I figured I’d just write a sample program just to show how it’s done.
0 comments