logo search
ОСиС-2014(Передача№1) / 1_ОперСистСети_ЛР_Методичка_2012 / ОС_ЛР-09-13-14 / LAB7 / LAB7

Основные сообщения меню

При выборе разрешенного пункта меню (щелчке по пункту меню левой кнопкой мыши или нажатии клавиши 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. Наиболее употребительными являются первый и четвертый варианты.