You can use a floating pop-up menu in your application by passing the handle of a pop-up menu to the TrackPopupMenu function. An application typically calls TrackPopupMenu in a window procedure in response to a user-generated message, such as WM_LBUTTONDOWN or WM_KEYDOWN.
In addition to the pop-up menu handle, TrackPopupMenu requires that you specify the handle of the owner window, the position of the floating pop-up menu (in screen coordinates), and the mouse button that the user can use to choose an item.
You specify the position by providing x and y coordinates along with the TPM_CENTERALIGN, TPM_LEFTALIGN, or TPM_RIGHTALIGN flag. The flag specifies the position of the menu relative to the x and y coordinates.
You should let the user choose an item from a pop-up menu by using the same mouse button used to display the menu. To do this, you must specify the appropriate flag, either TMP_LEFTBUTTON or TMP_RIGHTBUTTON. These flags specify the mouse button that the user can use with a pop-up menu once it is displayed.
The example in this section contains portions of code from an application that creates and displays a floating pop-up menu that allows the user to set fonts and font attributes. The application displays the menu in the client area of its main window whenever the user clicks the left mouse button.
The menu template for the pop-up menu is provided in the application's resource-definition file and is defined as follows:
PopupMenu MENU
BEGIN
POPUP "Dummy Popup"
BEGIN
POPUP "Fonts"
BEGIN
MENUITEM "Courier", IDM_FONT_COURIER
MENUITEM "Times Roman", IDM_FONT_TMSRMN
MENUITEM "Swiss", IDM_FONT_SWISS
MENUITEM "Helvetica", IDM_FONT_HELV
MENUITEM "Old English", IDM_FONT_OLDENG
END
POPUP "Sizes"
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 "Styles"
BEGIN
MENUITEM "Bold", IDM_STYLE_BOLD
MENUITEM "Italic", IDM_STYLE_ITALIC
MENUITEM "Strike Out", IDM_STYLE_SO
MENUITEM "Superscript", IDM_STYLE_SUPER
MENUITEM "Subscript", IDM_STYLE_SUB
END
END
END
Following is the window procedure and supporting functions used to create and display the floating pop-up menu.
LRESULT APIENTRY MenuWndProc(hwnd, uMsg, wParam, lParam)
HWND hwnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
RECT rc; /* client area */
POINT pt; /* location of mouse click */
switch (uMsg) {
case WM_LBUTTONDOWN:
/* Get the bounding rectangle of the client area. */
GetClientRect(hwnd, (LPRECT) &rc);
/* Get the client coordinates of the mouse click. */
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
/*
* If the mouse click was inside the client area,
* execute the application-defined function that
* displays the floating pop-up menu.
*/
if (PtInRect((LPRECT) &rc, pt))
HandlePopupMenu(hwnd, pt);
break;
.
. /* Process other window messages. */
.
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return NULL;
}
VOID APIENTRY HandlePopupMenu(hwnd, pt)
HWND hwnd;
POINT pt;
{
HMENU hmenu; /* menu template */
HMENU hmenuTrackPopup; /* floating pop-up menu */
/*
* Load the menu template containing the pop-up menu from the
* applications resources.
*/
hmenu = LoadMenu(hinst, "PopupMenu");
if (hmenu == NULL)
return;
/*
* Get the first pop-up menu in the menu template. This is the
* menu that TrackPopupMenu will display.
*/
hmenuTrackPopup = GetSubMenu(hmenu, 0);
/*
* TrackPopup expects screen coordinates, so convert the
* coordinates of the mouse click to screen coordinates.
*/
ClientToScreen(hwnd, (LPPOINT) &pt);
/* Draw and track the floating pop-up menu. */
TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON,
pt.x, pt.y, 0, hwnd, NULL);
/* Destroy the menu.*/
DestroyMenu(hmenu);
}