Окт 16 2009

Таблица быстрых клавиш

Эта таблица обычно создается при помощи редактора таблиц быстрых клавиш. Для его запуска нужно выполнить команду меню Insert ► Resource в главном меню приложения Visual Studio. В появившемся диалоговом окне Insert Resource следует указать тип ресурса Accelerator, после чего нажать кнопку New. В результате будет открыто окно редактора таблицы быстрых клавиш .
По умолчанию редактор присваивает таблице быстрых клавиш имя IDR_AC CELE-RATOR1. В файле resource.h этот идентификатор определяется как целочисленная константа. В большинстве случаев можно согласиться с этим именем по умолчанию. После двойного щелчка на пустой строке таблицы откроется диалоговое окно Accel Properties .
В поле ID введите идентификатор быстрой клавиши. Если быстрая клавиша дублирует пункт меню, то этот идентификатор должен совпадать с идентификатором пункта меню. Например, если определяется быстрая клавиша для пункта &0реп... подменю File для приложения MenuDemol, следует ввести идентификатор IDM_0PEN.
В группе переключателей Туре оставьте включенным переключатель VirtKey, так как в поле Key будет указываться виртуальная клавиша. Введите в поле Key идентификатор нужной клавиши. Для цифр и латинских букв в качестве идентификатора вводится сам символ.
В группе Modifiers установите те флажки, которые соответствуют дополнительным клавишам, входящим в определяемую комбинацию клавиш.
Например, если определяется быстрая клавиша Ctrl+О для пункта &0реп..., то следует оставить включенным флажок Ctrl, а в поле Key ввести символ 0 (строчная буква «О» английского алфавита).
Описанная процедура определения строки в таблице быстрых клавиш повторяется для задания информации о каждой быстрой клавише в обрабатываемом меню. После этого определенный ресурс сохраняется в файле описания ресурсов.


Окт 16 2009

Модификация определения ресурса меню

Говоря о модификации, мы подразумеваем, что ресурс меню уже был определен ранее, без учета использования быстрых клавиш. В принципе, ничто не мешает вам заранее продумать вопрос дублирования меню быстрыми клавишами и сделать те добавления, о которых говорится здесь, на этапе создания меню.
Для модификации определения пункта вызовите диалоговое окно Menu Item Properties и в конце имени пункта, которое указано в поле Caption, добавьте текстовую строку \t.<обозначение быстрой клавиши>.
Например, если добавляется быстрая клавиша Ctrl+О для дублирования пункта &0реп... из подменю File, то следует добавить к прежнему имени текстовую строку \tCtrl+0. После модификации поле Caption будет содержать строку &Open...\tCtrl+0.


Окт 16 2009

Быстрые клавиши

Быстрая клавиша (keyboard accelerator) — это клавиша или комбинация клавиш, которые при нажатии генерируют сообщение WM_COMMAND или WM_SYSCOMMAND.
Обычно быстрые клавиши дублируют пункты меню, предоставляя пользователю альтернативный способ вызова команд. На рис. 6.2 мы уже видели обозначения быстрых клавиш на полосе подменю File в окне приложения Visual Studio. Например, команду New пользователь может вызвать, либо выбрав пункт File ► New, либо нажав сочетание клавиш Ctrl+N. Очевидно, что второй способ быстрее.
Хотя традиционно быстрые клавиши являются эквивалентом пунктов-команд меню, они могут генерировать и такие команды, которых нет в меню.
Для многооконных приложений с множеством оконных процедур быстрые клавиши очень важны. Как известно, Windows посылает сообщения клавиатуры оконной процедуре того окна, которое в данный момент имеет фокус ввода. Однако при работе с быстрыми клавишами Windows посылает сообщение WM_COMMAND той оконной процедуре, чей дескриптор был передан функции TranslateAccelerator. Как правило, это будет оконная процедура главного окна приложения, то есть именно того окна, в котором расположено меню. Следовательно, нет необходимости дублировать логику обработки быстрых клавиш в каждой оконной процедуре.
Чтобы добавить в приложение обработку быстрых клавиш, нужно выполнить простую последовательность действий:
1. Модифицировать определение ресурса меню, добавив к имени каждого дублируемого пункта информацию о быстрой клавише.
2. Определить таблицу быстрых клавиш в файле описания ресурсов.
3. Обеспечить загрузку таблицы быстрых клавиш в память приложения.
4. Модифицировать цикл обработки сообщений в функции WinMain.


Окт 16 2009

Приложение MenuDemo2

Приложение MenuDemo2 решает те же задачи, что и приложение MenuDemol, отличаясь от него только организацией меню. Главное меню приложения MenuDemo2 содержит те же пункты, что и приложение MenuDemol, за вычетом пункта Draw shape. Подменю второго уровня Shape и Color для отсутствующего пункта Draw shape должны быть реализованы в виде контекстных меню.
Первое контекстное меню, всплывающее при щелчке мышью в левой половине окна, позволяет выбрать вид фигуры. Второе контекстное меню, всплывающее при щелчке мышью в правой половине окна, позволяет выбрать цвет заливки фигуры.
Создайте новый проект с именем MenuDemo2. Скопируйте из папки проекта MenuDemol в папку проекта MenuDemo2 файлы с расширениями .срр, .h и .гс, скорректировав их имена заменой MenuDemol на MenuDemo2. Добавьте эти файлы в состав проекта.
Откройте в окне редактирования файл recource.h и найдите строку комментария
// Used by MenuDemol.rc
Замените ее следующей строкой:
// Used by MenuDemo2.rc
В окне Workspace перейдите на вкладку ResourceView, откройте в иерархическом списке папку Menu и двойным щелчком мыши на элементе IDR_MENU1 вызовите редактор меню.
Из меню нужно удалить пункт Draw shape, выделив его мышью и нажав клавишу Delete. Среда разработки Visual Studio не позволит сделать это сразу, выведя предупреждение в виде диалогового окна.


Окт 16 2009

Вызов меню

Когда пользователь делает щелчок правой кнопкой мыши, Windows отправляет окну приложения сообщение WM_RBUTT0ND0WN, содержащее клиентские координаты1 курсора мыши в момент щелчка. Кроме того, Windows отправляет сообщение WM_CONTEXTMENU, содержащее экранные координаты (screen coordinates) курсора мыши. Вы можете организовать вызов контекстного меню, обрабатывая любое из этих сообщений, при помощи функции TrackPopupMenuEx.
Второй параметр функции может содержать флаги, управляющие размещением полосы меню относительно позиции курсора мыши (х, у), и флаги, задающие некоторые другие характеристики. Обычно можно воспользоваться флагами по умолчанию, передавая этому параметру нулевое значение. По умолчанию левый верхний угол всплывающего меню привязывается к точке (х, у).
Параметрам х и у необходимо передать экранные координаты курсора мыши в момент щелчка правой кнопкой. Координаты курсора мыши можно извлечь из параметра IParam сообщения WM_RBUTTONDOWN или сообщения WM_CONTEXTMENU. Нужно только учесть, что сообщение WM_RBUTTONDOWN содержит клиентские координаты, поэтому при работе с этим сообщением необходимо преобразовать клиентские координаты в экранные координаты при помощи функции CLientToScreen.
Параметр hwnd содержит дескриптор окна, владеющего контекстным меню. Все сообщения от меню будут направляться этому окну. При помощи параметра Iptpm можно определить область экрана, которую меню не должно перекрывать. Чаще всего этому параметру передается значение NULL.
Функция не возвращает управление до тех пор, пока работа пользователя с меню не будет завершена выбором пункта или отказом от выбора.
Обработка сообщений, направляемых окну-владельцу от контекстного меню, не отличается от обработки сообщений, источником которых является основное меню.
Приемы работы с контекстным меню продемонстрируем на примере разработки конкретного приложения.


Окт 16 2009

Загрузка меню

Загрузка контекстного меню осуществляется в блоке обработки сообщения WM_CREATE при помощи функций LoadMenu и GetSubMenu:
HMENU hMenuMyContext;
hMenuMyContext = LoadMeniUhlnstance, MAKEINTRESOURCE(IDR_MENU_MYCONTEXT));
hMenuMyContext = GetSubMeniKhMenuMyContext, 0);
Функция LoadMenu возвращает дескриптор меню, определенного в файле ресурсов с идентификатором IDR_MENL)_MYCONTEXT. Этот дескриптор относится к фиктивному меню нулевого уровня, которое не должно отображаться на экране. Содержанием контекстного меню является нулевой пункт указанного меню, поэтому окончательное значение дескриптора hMenuMyContext определяется вызовом функции GetSubMenu.
Полученный дескриптор hMenuMyContext потом передается функции Track Popup-Men u Ex, которая выводит всплывающее контекстное меню на экран.


Окт 16 2009

Определение шаблона контекстного меню

Создавая шаблон контекстного меню с помощью редактора меню, определите нулевой пункт меню нулевого уровня как подменю, имеющее какое-нибудь условное имя. Этот пункт нигде не будет отображаться. Он необходим только для получения дескриптора подменю с помощью функции GetSubMenu.
Затем определите подменю (меню 1-го уровня) по процедуре, описанной выше.
Сохраните созданный шаблон в файле описания ресурсов, назначив ему подходящий идентификатор, например IDR_MENU_MYCONTEXT.


Окт 16 2009

Работа с контекстным меню

Контекстное меню, называемое иногда меню быстрого вызова (shortcut menu), появляется в любой части окна приложения при щелчке правой кнопкой мыши. Оно выглядит как всплывающее меню, но без привязки к меню верхнего уровня. Обычно содержание контекстного меню изменяется в зависимости от «контекста» — места, где произведен щелчок правой кнопкой мыши. В сложных приложениях контекстные меню часто содержат пункты, дублирующие команды основного меню, но сгруппированные иначе, чтобы максимально облегчить пользователю работу с приложением. После выбора пункта контекстного меню оно исчезает с экрана.
Конечно же, для программиста создание и обработка контекстного меню имеют свою специфику.


Окт 16 2009

Приложение MenuDemo1

Для демонстрации техники использования меню приведем пример разработки специального учебного приложения MenuDemol.
Эта программа должна рисовать в центре окна прямоугольник, ромб или эллипс по выбору пользователя. Фигура закрашивается однородной кистью. Цвет кисти задается пользователем как комбинация цветовых составляющих Red, Green, Blue с учетом интенсивности, выбираемой из трех вариантов: Dark (темный цвет), Medium (средний цвет), Light (светлый цвет). Также по команде пользователя программа должна увеличивать размеры фигур до полного заполнения клиентской области окна, а также возвращать их к исходному размеру. Программа должна позволить пользователю скрыть изображение, а потом снова показать его. Также в приложении должно функционировать подменю File, пункты которого вызывают окна сообщений с информацией о выбранном пункте.


Окт 16 2009

Сообщения меню

Система Windows посылает сообщение WM_COMMAND при каждом выборе пункта меню, определяющего команду. Обычно это единственное сообщение, обрабатываемое приложением, которое может поступить от меню. При выборе пунктов системного меню вместо указанного сообщения отправляется сообщение WM_SYSCOMMAND.
Иногда в программе может потребоваться обработка сообщений WM_INITMENU и WM_INITMENUPOPUP. Они отправляются непосредственно перед активизацией главного меню или всплывающего меню. Эти сообщения позволяют приложению изменить меню перед тем, как оно будет отображено на экране.
Сообщение WM_MENUCHAR отправляется, если пользователь пытается использовать клавиатурную «горячую» клавишу, которая не соответствует ни одному из мнемонических символов меню. Это позволяет обрабатывать несколько «горячих» клавиш для одного пункта меню или отображать сообщение об ошибке.
При навигации по меню система отправляет также сообщение WM_MENUSELECT. Оно более универсально по сравнению с WM_COMMAND, так как инициируется даже тогда, когда выделен недоступный или запрещенный пункт. Это сообщение может использоваться для формирования контекстной справки меню, которая отображается в строке состояния приложения.
В большинстве программ все сообщения от меню, кроме WM_COMMAND, передаются на обработку в функцию DefWindowProc.


Следующая страница »