- •Глава 10 Меню и быстрые клавиши
- •Структура меню
- •Шаблон меню
- •Ссылки на меню в вашей программе
- •Меню и сообщения
- •Образец программы
- •Этикет при организации меню
- •Сложный способ определения меню
- •Третий подход к определению меню
- •Независимые всплывающие меню
- •Использование системного меню
- •Изменение меню
- •Другие команды меню
- •Нестандартный подход к меню
- •Использование в меню битовых образов
- •Два способа создания битовых образов для меню
- •Контекст памяти
- •Создание битового образа, содержащего текст
- •Масштабирование битовых образов
- •Соберем все вместе
- •Добавление интерфейса клавиатуры
- •Быстрые клавиши
- •Зачем нужны быстрые клавиши?
- •Некоторые правила назначения быстрых клавиш
- •Загрузка таблицы быстрых клавиш
- •Преобразование нажатий клавиш клавиатуры
- •Получение сообщений быстрых клавиш
- •Программа poppad, имеющая меню и быстрые клавиши
- •Разрешение пунктов меню
- •Обработка опций меню
Соберем все вместе
В функции WinMain программы GRAFMENU при создании меню используются функции StretchBitmap и GetBitmapFont. В программе GRAFMENU имеется два меню, определенных ранее в файле описания ресурсов. Они станут всплывающими меню для опций File и Edit.
Программа GRAFMENU начинается с получения описателя пустого меню:
hMenu = CreateMenu () ;
Всплывающее меню File (содержащее четыре опции New, Open, Save и Save As) загружается из файла описания ресурсов:
hMenuPopup = LoadMenu (hInstance, "MenuFile") ;
Битовый образ, в котором содержится слово "FILE", также загружается из файла описания ресурсов, а затем с помощью функции StretchBitmap, увеличивается его размер:
hBitmapFile = StretchBitmap (LoadBitmap (hInstance, "BitmapFile")) ;
Описатели битового образа и всплывающего меню становятся параметрами функции AppendMenu:
AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,
(PSTR) (LONG) hBitmapFile) ;
Аналогичные действия выполняются для меню Edit:
hMenuPopup = LoadMenu (hInstance, "MenuEdit") ;
hBitmapEdit = StretchBitmap (LoadBitmap (hInstance, "BitmapEdit")) ;
AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,
(PSTR) (LONG) hBitmapEdit ) ;
Всплывающее меню трех шрифтов создается при последовательных вызовах функции GetBitmapFont :
hMenuPopup = CreateMenu () ;
for (i = 0 ; i < 3 ; i++)
{
hBitmapPopFont[i] = GetBitmapFont (i) ;
AppendMenu (hMenuPopup, MF_BITMAP, IDM_COUR + i,
(PSTR) (LONG) hMenuPopupFont[i]) ;
}
Затем всплывающее меню добавляется к основному меню:
hBitmapFont = StretchBitmap (LoadBitmap (hInstance, "BitmapFont")) ;
AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,
(PSTR) (LONG) hBitmapFont) ;
Меню окна готово. Теперь можно включить описатель меню hMenu в вызов функции CreateWindow:
hwnd = CreateWindow (szAppName, "Bitmap Menu Demonstration",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenu, hInstance, NULL) ;
После получения hwnd, программа GRAFMENU может изменить системное меню. Сначала программа получает его описатель:
hMenu = GetSystemMenu (hwnd, FALSE) ;
Следующая инструкция загружает битовый образ "Help" и увеличивает его до соответствующего размера:
hBitmapHelp = StretchBitmap (LoadBitmap (hInstance, "BitmapHelp")) ;
Теперь к системному меню добавляется разделитель и увеличенный битовый образ:
AppendMenu (hMenu, MF_SEPARATOR, NULL, NULL) ;
AppendMenu (hMenu, MF_BITMAP, IDM_HELP,
(PSTR) (LONG) hBitmapHelp) ;
Запомните, что битовые образы являются объектами GDI и должны быть явно удалены при завершении программы. В программе GRAFMENU эта задача решается после выхода из цикла обработки сообщений:
DeleteObject (hBitmapHelp) ;
DeleteObject (hBitmapEdit) ;
DeleteObject (hBitmapFile) ;
DeleteObject (hBitmapFont) ;
for (i = 0 ; i < 3 ; i++)
DeleteObject (hBitmapPopFont[i]) ;
В заключении раздела приведем несколько общих замечаний:
Высоту панели главного меню Windows изменяет таким образом, чтобы туда уместился самый высокий битовый образ. Другие битовые образы (или символьные строки) выравниваются по верхней границе панели меню. Размер панели меню, полученный от функции:
GetSystemMetrics (SM_CYMENU)
изменяется, поскольку в меню добавлены битовые образы.
При работе с программой GRAFMENU, можно использовать метки пунктов всплывающих меню, заданных в виде битовых образов, но метки при этом имеют обычный размер. Если это вам не нравится, то можно создать свои метки и использовать функцию SetMenuItemBitmaps.
Другим подходом к использованию в меню не текста (или текста, набранного не системным шрифтом) является меню, отображаемое владельцем (owner-draw).
