Win32 API. Меню - Создание контекстного меню Атрибуты Шрифта (Font-Attributes)
ОГЛАВЛЕНИЕ
Страница 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);
}