11.18.2.2 - Создание контекстного меню Атрибуты Шрифта (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);
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков - 06.10.2002