47.2.2 Creating a Floating Pop-up Menu

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.

47.2.2.1 Example: Creating a Floating Font-Attributes Menu

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);

}