Основные сообщения меню
При выборе разрешенного пункта меню (щелчке по пункту меню левой кнопкой мыши или нажатии клавиши Enter) программе посылается сообщение WM_COMMAND с параметрами
loWord(wParam) - числовой идентификатор пункта меню
hiWord(wParam) = 0; lParam = 0
При выборе пункта системного меню (открываемого при щелчке по значку в левом верхнем углу окна) посылается сообщение WM_SYSCOMMAND с теми же параметрами. Для анализа команды необходимо замаскировать младшие 4 бита младшего слова wParam, т.е. выражение (loword(wParam) and $FFF0) может принимать значения sc_size, sc_move, sc_minimize, sc_maximize, sc_close и др. Сообщение WM_SYSMENU обычно передается в DefWindowProc.
При каждом перемещении указателя по меню при помощи мыши или клавиш управления курсором программе посылается сообщение WM_MENUSELECT. Оно полезно, например, для вывода подсказки по выбранному пункту меню в строке состояния окна. Параметры:
loword(wParam) - числовой идентификатор пункта меню или хэндл всплывающего меню
hiword(wParam) - флаги выбора
lParam - хэндл меню, содержащего выбранный пункт
Флаги выбора содержат логическую сумму констант MF_GRAYED, MF_DISABLED, MF_CHECKED, MF_POPUP, MF_SYSMENU, MF_MOUSESELECT и др.
Перед автоматическим выводом на экран всплывающего меню программа получает сообщение WM_INITMENUPOPUP, позволяющее привести содержимое меню в надлежащий вид, например — разрешить или запретить некоторые его пункты. Параметры:
wParam - хэндл всплывающего меню
loword(lParam) - индекс всплывающего меню
hiword(lParam) - 1 для системного меню и 0 для обычного
Для простейшего управления меню используются вызовы
EnableMenuItem(hMenu, id, MF_GARAYED);
EnableMenuItem(hMenu, id, MF_ENABLED);
CheckMenuItem(hMenu, id, MF_UNCHECKED);
CheckMenuItem(hMenu, id, MF_CHECKED);
Для управления меню (в том числе системным меню окна) и создания меню также используются следующие функции, с описанием которых можно ознакомиться в Справке по Win32 API:
CreateMenu, CreatePopupMenu, AppendMenu, GetSystemMenu, DeleteMenu, RemoveMenu, InsertMenu, ModifyMenu, DrawMenuBar, GetSubMenu, GetMenuItemCount, GetMenuItemID, TrackPopupMenu.
Таблица акселераторов
Таблицы акселераторов используются для упрощения построения интерфейса клавиатуры. В этой таблице задаются комбинации клавиш (как правило, соответствующие пунктам меню, хотя это необязательно), нажатие которых автоматически приводит к генерации сообщений WM_COMMAND с тем или иным кодом.
В файле описания ресурсов таблицы акселераторов определяются следующим образом:
<имя_таблицы> ACCELERATORS
{
[определения комбинаций клавиш]
}
В качестве имени таблицы можно указывать символьный или числовой идентификатор, как и для меню. Определения клавиш — это строки одного из четырех возможных форматов:
"<символ>", <числовой_идентификатор> [, SHIFT] [, CONTROL] [, ALT]
"^<символ>", <числовой_идентификатор> [, SHIFT] [, CONTROL] [, ALT]
<ASCII-код>, <числовой_идентификатор>, ASCII [, SHIFT] [, CONTROL] [, ALT]
<виртуальный_код>, <числовой_идентификатор>, VIRTKEY [, SHIFT] [, CONTROL] [, ALT]
Числовой идентификатор быстрой клавиши передается в параметрах сообщения WM_COMMAND. Слова SHIFT, CONTROL и ALT означают, что указанные регистровые клавиши образуют комбинацию с клавишей, код которой указывается в первом параметре.
Первый способ определения клавиши подразумевает, что в первом параметре указан символ, соответствующий алфавитно-цифровой клавише, второй — что это комбинация символа с клавишей Ctrl (фраза CONTROL в этом случае ничего не меняет), в третьем случае первым параметром должен быть числовой код буквы, в последнем случае — виртуальный код клавиши Windows. Наиболее употребительными являются первый и четвертый варианты.
- Подключение файлов ресурсов к программе
- Ресурсы пользователя
- Inactive - пункт неактивен (не генерирует wm_command), но отображается обычным образом, несовместимо с grayed.
- Основные сообщения меню
- Использование таблицы акселераторов
- Окна диалога
- Библиотеки dll
- Синтаксис исходного текста dll
- Поиск используемых dll
- Подключение dll на этапе загрузки
- Подключение dll на этапе выполнения
- Использование ресурсов из dll
- Задание
- Варианты заданий: