Сообщения, поступающие от меню
Меню посылает сообщения в функцию создавшего его окна.
Сообщение WM_INITMENU посылается перед отображением меню и может быть использовано для инициализации. Сообщение WM_COMMAND посылается после того, как пользователь выберет одну из активных строк меню. Системное меню посылает в окно приложения сообщение WM_SYSCOMMAND, которое обычно не обрабатывается приложением (передается функции DefWindowProc). В процессе выбора строки из меню, когда курсор перемещается по строкам меню, функция окна, создавшего меню, получает сообщение WM_MENUSELECT. Перед инициализацией временного меню функция окна получает сообщение WM_INITMENUPOPUP.
Из всех этих сообщений наибольший интерес представляют сообщения WM_INITMENU, WM_INITMENUPOPUP, WM_COMMAND, WM_SYSCOMMAND.
Сообщение WM_INITMENU
Сообщение WM_INITMENU посылается окну, создавшему меню, в момент отображения меню. Это происходит, когда вы нажимаете на строку в полосе меню или активизируете временное меню при помощи клавиатуры.
Вместе с этим сообщением в параметре wParam передается идентификатор активизируемого меню. Параметр lParam не используется.
Если приложение обрабатывает сообщение WM_INITMENU, соответствующий обработчик должен вернуть нулевое значение. Обработка может заключаться в активизации или деактивизации строк меню, изменении состояния строк (отмеченное галочкой или не отмеченное) и т. п. Немного позже мы опишем функции, предназначенные для динамического изменения внешнего вида и состояния меню.
Сообщение WM_INITMENUPOPUP
Сообщение WM_INITMENUPOPUP посылается окну, когда операционная система Windows готова отобразить временное меню. Младшее слово параметра lParam содержит порядковый номер временного меню в меню верхнего уровня, старшее слово содержит 1 для системного меню или 0 для обычного меню.
Это сообщение можно использовать для активизации или блокирования отдельных строк временного меню.
Сообщение WM_COMMAND
Сообщение WM_COMMAND , как мы уже говорили, посылается функции окна приложения, создавшего меню, когда вы выбираете нужную вам строку. Параметр wParam содержит идентификатор строки, определенный в шаблоне меню.
Задача функции окна, обрабатывающей сообщения от меню, заключается в проверке значения параметра wParam и выполнении соответствующей функции.
Сообщение WM_SYSCOMMAND
Сообщение WM_SYSCOMMAND приходит в функцию окна приложения, когда пользователь выбирает строку из системного меню. Параметр wParam, как и для сообщения WM_COMMAND, содержит идентификатор строки меню, в данном случае, идентификатор строки системного меню. Параметр lParam не используется (за исключением идентификатора SC_HOTKEY).
Приведем список идентификаторов с кратким описанием.
Идентификатор | Описание |
SC_CLOSE | Удаление окна (строка "Close") |
SC_HOTKEY | Активизация окна, связанного с комбинацией клавиш, определенной приложением. Младшее слово параметра lParam содержит идентификатор активизируемого окна |
SC_HSCROLL | Свертка по горизонтали |
SC_KEYMENU | Выбор из меню при помощи комбинации клавиш |
SC_MAXIMIZE или SC_ZOOM | Максимизация окна (строка "Maximize") |
SC_MINIMIZE или SC_ICON | Минимизация окна (строка "Minimize") |
SC_MOUSEMENU | Выбор из меню при помощи мыши |
SC_MOVE | Перемещение окна (строка "Move") |
SC_NEXTWINDOW | Переключение на следующее окно |
SC_PREVWINDOW | Переключение на предыдущее окно |
SC_RESTORE | Восстановление нормального положения и размера окна |
SC_SCREENSAVE | Запуск приложения, предназначенного для предохранения экрана дисплея от преждевременного выгорания (screen-saver application), определенного в разделе [boot] файла system.ini |
SC_SIZE | Изменение размера окна (строка "Size") |
SC_TASKLIST | Запуск или активизация приложения Task Manager |
SC_VSCROLL | Свертка по вертикали |
При анализе параметра wParam учтите, что младшие четыре бита этого параметра могут принимать любые значения и должны игнорироваться:
if((wParam & 0xfff0) == SC_SIZE)
{
return 0;
}
Скоро мы расскажем вам о том, как можно добавлять строки в системное меню. При добавлении строк в системное меню вы должны указывать идентификатор строки. Этот идентификатор (с учетом сказанного выше относительно младших четырех битов) вы получите в параметре wParam сообщения WM_SYSCOMMAND при выборе добавленной вами строки.
Создав собственный обработчик для сообщений, приходящих от системного меню, вы можете блокировать отдельные или все строки этого меню. Для блокировки какой-либо строки соответствующий обработчик должен вернуть нулевое значение, как в приведенном выше фрагменте кода, блокирующем изменение размера окна.
Диалоговые панели
Обычно для объединения органов управления используются временные (pop-up) окна, созданные на базе предопределенного внутри Windows класса окон - класса диалоговых панелей (dialоg window class). На поверхности такого окна располагаются дочерние окна - органы управления. Функция окна для класса диалоговых панелей, определенная в Windows, выполняет практически всю работу, необходимую для организации взаимодействия органов управления с приложением.
Для создания каждого органа управления мы вызывали функцию CreateWindow, которой требовалось указывать расположение и размеры органов управления. Поэтому при необходимости внесения изменений во внешний вид приложения приходилось изменять исходные тексты. В функцию родительского окна приходили все сообщения и извещения от всех органов управления. Большие проблемы возникали при необходимости передачи фокуса ввода от одного органа управления к другому - функция родительского окна должна была управлять передачей фокуса ввода и организовывать взаимодействие органов управления самостоятельно.
Диалоговые панели значительно упрощают использование органов управления, так как функция окна, соответствующая классу диалоговых панелей и расположенная внутри Windows, обеспечивает как взаимодействие органов управления между собой, так и их взаимодействие с приложением. В частности, эта функция обеспечивает передачу фокуса ввода от одного органа управления к другому при помощи клавиши <Tab> и клавиш перемещения курсора <Up> и <Down>, выполняет обработку сообщений от клавиш <Enter> и <Esc>.
Что же касается расположения органов управления на поверхности диалоговой панели, то для этого можно использовать три способа.
Первый способ предполагает включение в файл ресурсов приложения текстового описания шаблона диалоговой панели. Это описание можно создать при помощи любого текстового редактора:
Второй способ размещения органов управления на поверхности диалоговой панели предполагает использование специального редактора диалогов, такого как Borland Resource Workshop или Microsoft Dialog Editor. Эти редакторы позволяют нарисовать диалоговую панель и сохранить ее текстовое описание в файле ресурсов приложения.
Третий способ предполагает создание шаблона диалоговой панели в памяти во время работы приложения. Этот способ используется редко, обычно только в тех случаях, когда внешний вид диалоговой панели нельзя определить на этапе создания приложения.
Дата добавления: 2016-07-22; просмотров: 1415;