Страница 16 из 26 Создание контекстного меню Атрибуты Шрифта (Font-Attributes) Пример в этом разделе содержит части кода из прикладной программы, которая создает и показывает на экране контекстное меню, разрешающее пользователю установить отличительные признаки (атрибуты) шрифта и шрифты. Приложение показывает на экране меню в рабочей области основного окна всякий раз, когда пользователь щелкает мышью по левой кнопке мыши. Здесь шаблон меню для контекстного меню, который дается в файле определения ресурса прикладной программы. 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
Следующий пример дает оконную процедуру и обеспечивающие функции, использованные, чтобы создавать и показывать на экране контекстное меню. LRESULT APIENTRY MenuWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { RECT rc;// рабочая область POINT pt;// место щелчка мыши switch (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; . . // Обработка других сообщений окна. . default: 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); } |