Приведу код:
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
HBRUSH shape_brush, old_brush;
RECT rc;
static HMENU main_menu;
static HMENU shape_contextmenu, colour_contextmenu;
static BOOLEAN show_shape;
static ShapeData shape_data;
static TCHAR* idm_resize_value [] = { _T("Decrease!"), _T("Increase!") };
static const int W = 200, H = 100;
int x0, y0, x1, x2, y1, y2;
std::basic_string<TCHAR> msg;
int brightness;
POINT pt[4]; // for rhomb
POINT ptInScreen, ptInClient;
switch(uMsg)
{
case WM_CREATE:
main_menu = GetMenu(hWnd);
shape_contextmenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU_SHAPECONTEXT));
//shape_contextmenu = GetSubMenu(shape_contextmenu, 0);
colour_contextmenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU_COLOURCONTEXT));
//colour_contextmenu = GetSubMenu(colour_contextmenu, 0);
SetMenuDefaultItem(GetSubMenu(main_menu, 0), IDM_OPEN, FALSE);
CheckMenuRadioItem(GetSubMenu(main_menu, 1), IDM_SHOW, IDM_HIDE, IDM_SHOW, MF_BYCOMMAND);
CheckMenuRadioItem(shape_contextmenu, ID_RECTANGLE, ID_RHOMB, ID_RECTANGLE, MF_BYCOMMAND);
CheckMenuRadioItem(colour_contextmenu, ID_DARK, ID_LIGHT, ID_DARK, MF_BYCOMMAND);
show_shape = TRUE;
shape_data.id_shape = ID_RECTANGLE;
shape_data.intensity = ID_DARK;
shape_data.shapeSize = ShapeData::MIN;
break;
case WM_CONTEXTMENU:
ptInScreen.x = LOWORD(lParam);
ptInScreen.y = LOWORD(lParam);
ptInClient = ptInScreen;
ScreenToClient(hWnd, &ptInClient);
GetClientRect(hWnd, &rc);
if( ptInClient.x < rc.right / 2 )
TrackPopupMenu(shape_contextmenu, 0, ptInScreen.x, ptInScreen.y, 0, hWnd, NULL);
else
TrackPopupMenu(colour_contextmenu, 0, ptInScreen.x, ptInScreen.y, 0, hWnd, NULL);
break;
...
В результате отображается контекстное меню в виде прямоугольника (см. справа налево) шириной в несколько пикселей и длиной (высотой), соответствующей длине(высоте) при создании в редакторе меню. При этом пункты меню отрабатывают команды.