68896

Ресурсы (быстрые клавиши)

Лекция

Информатика, кибернетика и программирование

Чаще всего быстрые клавиши используются в программах для дублирования действий обычных опций меню. Однако быстрые клавиши могут выполнять и такие функции которых нет в меню. Например в некоторых программах для Windows имеется меню Edit которое включает в себя опцию Delete...

Русский

2014-09-26

48 KB

0 чел.

Лекция 9 Ресурсы (быстрые клавиши)

Добавление интерфейса клавиатуры

Быстрые клавиши (keyboard accelerators) это комбинации клавиш, которые генерируют сообщения WM_COMMAND (в некоторых случаях WM_SYSCOMMAND). Чаще всего быстрые клавиши используются в программах для дублирования действий обычных опций меню. (Однако быстрые клавиши могут выполнять и такие функции, которых нет в меню.) Например, в некоторых программах для Windows имеется меню Edit, которое включает в себя опцию Delete; в этих программах для этой опции быстрой клавишей обычно является клавиша <Del>. Пользователь может выбрать из меню опцию Delete, нажимая <Alt>-комбинацию, или может просто нажать быструю клавишу <Del>. Когда оконная процедура получает сообщение WM_COMMAND, то ей не нужно определять, что именно, меню или быстрая клавиша, использовались.

Для многооконных приложений с множеством оконных процедур быстрые клавиши очень важны. Как известно, Windows посылает сообщения клавиатуры оконной процедуре того окна, которое в данный момент имеет фокус ввода. Однако, в случае быстрых клавиш Windows посылает сообщение WM_COMMAND той оконной процедуре, чей описатель задан в функции TranslateAccelerator. Как правило, это будет оконная процедура главного окна вашей программы, т. е. того окна, в котором имеется меню. Следовательно, нет необходимости дублировать логику действия быстрых клавиш в каждой оконной процедуре.

Это преимущество становится особенно важным при использовании немодальных окон диалога или дочерних окон, расположенных в рабочей области вашего главного окна. Если при наличии нескольких окон для перемещения между окнами назначается определенная быстрая клавиша, то только одна оконная процедура должна включать в себя эту логику. Дочерние окна не получают от быстрых клавиш сообщений WM_COMMAND.

Некоторые правила назначения быстрых клавиш

Теоретически можно определить быструю клавиши почти для каждой виртуальной или символьной клавиши в сочетании с клавишами <Shift>, <Ctrl> или <Alt>. Однако надо попытаться добиться какого-то соответствия с другими приложениями и избегать применения тех клавиш, которые использует Windows. Нежелательно назначать быстрыми клавишами клавиши <Tab>, <Enter>, <Esc>, <Spacebar>, поскольку они часто используются для системных функций.

Другой известной быстрой клавишей является клавиша <F1> для вызова подсказки. Избегайте применения клавиш <F4>, <F5> и <F6>, поскольку они часто используются для специальных функций многооконного интерфейса приложений (Multiple Document Interface, MDI).

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

Быстрые клавиши определяются в файле описания ресурсов (файл с расширением .RC). Здесь показана общая форма определения:

MyAccelerators ACCELERATORS

{

[определения быстрых клавиш]

}

Эта таблица быстрых клавиш называется MyAccelerators. В таблицу ACCELERATORS не включаются опции загрузки и памяти. В файле описания ресурсов можно иметь несколько таблиц ACCELERATORS.

Для каждой определяемой быстрой клавиши необходима отдельная строка таблицы. Имеется четыре типа определений быстрых клавиш:

"char",   id          [,<SHIFT>] [,CONTROL] [,<ALT>]

"^char", id          [,<SHIFT>] [,CONTROL] [,<ALT>]

nCode,   id, ASCII [,<SHIFT>] [,CONTROL] [,<ALT>]

nCode,   id, VIRTKEY  [,<SHIFT>] [,CONTROL] [,<ALT>]

В этих примерах "char" означает один символ, заключенный в кавычки, а "^char" — это символ ^ и один символ, заключенный в кавычки. Число id выполняет ту же функцию, что и идентификатор меню в определении меню. Это значение, которое Windows посылает вашей оконной процедуре в сообщении WM_COMMAND для идентификации быстрой клавиши. Обычно эти идентификаторы определяются в заголовочном файле. Быстрые клавиши почти всегда служат для выбора опций из всплывающих меню. Если быстрая клавиша дублирует команду меню, используйте один и тот же идентификатор для меню и для быстрой клавиши. Если быстрая клавиша не дублирует команду меню, используйте уникальный идентификатор.

В первом типе определения идентификатора быстрая клавиша это чувствительный к регистру символ в кавычках:

"char", ''    id                   [,<SHIFT>] [,CONTROL] [,<ALT>]

Если вы хотите использовать эту клавишу в сочетании с одной или более клавишами <Shift>, <Ctri> и <Alt>, просто добавьте SHIFT, CONTROL и/или ALT.

В определении второго типа быстрая клавиша это символ в сочетании с клавишей <Ctrl>:

"^char",      id                   [,<SHIET>] [.CONTROL] [,<ALT>]

Этот тип определения эквивалентен первому, если бы в нем за символом было бы указано ключевое слово CONTROL.

В определениях третьего и четвертого типов вместо символа в кавычках используется число (nCode):

nCode,        id, ASCII           [,<SHIFT>] [.CONTROL] [,<ALT>]

nCode,        id, VIRTKEY         [,<SHIFT>] [.CONTROL] [,<ALT>]

Это число интерпретируется либо как чувствительный к регистру ASCII-код символа, либо как код виртуальной клавиши, в зависимости от наличия ключевого слова ASCII или VIRTKEY.

Наиболее часто используются определения быстрых клавиш второго и четвертого типа. В определении второго типа буквенная клавиша используется в сочетании с клавишей <Ctrl>. Например, здесь определяется быстрая клавиша <Ctrl>+<A>:

'"^A", id

Определение четвертого типа используется для виртуальных кодов клавиш, таких как функциональные клавиши. Для комбинации <Ctri>+<F9> используется следующее определение:

VK_F9, wid, VIRTKEY, CONTROL

Идентификатор VK_F9 определяется в заголовочных файлах Windows в качестве виртуального кода клавиши <F9>, поэтому, вы должны включить в программу в начале файла описания ресурсов инструкцию:

#include <windows.h>

Приведенные выше определения первого и третьего типов применяются редко. Если вы хотите их использовать, внимательно контролируйте чувствительность к регистру. Windows осуществляет чувствительный к регистру контроль совпадения "char" или nCode, основываясь на нажатой клавише. Если вы добавляете ключевое слово SHIFT, Windows контролирует, нажата или нет клавиша <Shift>. Эта ситуация иногда приводит к неожиданному результату. Например, если "char" — это "А", то быстрая клавиша срабатывает, если нажата клавиша <А> или при нажатой клавише <Shift> или при включенном режиме Caps Lock. Если вы используете "А" с ключевым словом SHIFT, то быстрая клавиша активизируется, если нажата клавиша <А> при нажатой клавише <Shift>, но не должна вызываться при включенном режиме Caps Lock. Точно также "а" сама по себе является быстрой клавишей для клавиши <А> нижнего регистра или для клавиши <А> с нажатой клавишей <Shift> и включенном режиме Caps Lock. Но "о" с ключевым словом SHIFT является быстрой клавишей только в одном случае, если клавиша <Shift> нажата, a Caps Lock включен.

При определении быстрых клавиш для пунктов меню необходимо включить описание комбинации быстрых клавиш в текст соответствующего пункта меню. Символ табуляции (\t) разделяет текст и описание быстрой клавиши ^ так, чтобы описание быстрых клавиш располагалось во втором столбце. При наличии слов Shift, Ctrl или Alt после них пишется знак плюс и собственно клавиша. Например:

F6

Shift+F6

Ctri+F6

Загрузка таблицы быстрых клавиш

Внутри программы для загрузки таблицы быстрых клавиш в память и получения ее описателя используется функция LoadAccelerators. Инструкция с функцией LoadAccelerators очень похожа на аналогичные инструкции с Loadlcon, LoadCursor, LoadBltmap и LoadMenu.

Сначала таблица быстрых клавиш определяется как имеющая тип HACCEL:

HACCEL hAccel ;

Затем производится загрузка таблицы:

hAccel = LoadAccelerators (hinstance, "MyAccelerators") ;

Как и в случаях с иконками, курсорами, битовыми образами и меню, вместо имени таблицы быстрых клавиш можно вставить число, которое затем будет использоваться в инструкции, содержащей функцию LoadAccelerators и макрос makeintresource. Вместо макроса перед числом можно ставить символ #, тогда весь параметр заключается в кавычки.

Преобразование нажатий клавиш клавиатуры

Мы не будем менять те три строки программы, которые являются общими почти для всех программ Windows, уже приведенных в Лекции 2. Данная инструкция стандартный цикл обработки сообщений:

while (GetMessage(&msg, NULL, 0, 0))

{ TranslateMessage (&msg) ;

DispatchMessage (&msg) ;  }

Далее приводятся те изменения, которые необходимы, чтобы использовать таблицу быстрых клавиш:

while (GetMessage(&msg, NULL, 0, 0))

{ if (!TranslateAccelerator (hwnd, hAccel, &msg))

{ TranslateMessage (&msg) ;

 DispatchMessage (&msg) ;

} }

Функция TranslateAccelerator определяет, является ли сообщение, хранящееся в структуре msg, сообщением клавиатуры. Если да, функция ищет соответствия в таблице быстрых клавиш, описателем которой является hAccel. Если соответствие находится, она вызывает оконную процедуру окна, описателем которого является hwnd. Если быстрая клавиша соответствует пункту системного меню, то отправляемым сообщением является WM_SYSCOMMAND. В противном случае WM_COMMAND.

Возвращаемое значение функции TranslateAccelerator не равно нулю, если сообщение уже было преобразовано (и уже отправлено в оконную процедуру), и равно 0, если нет. Если возвращаемое значение функции TranslateAccelerator не равно нулю, то нет необходимости вызывать функции TranslateMessage и DispatchMessage, и поэтому управление вновь передается функции GetMessage.

Параметр hwnd функции TranslateAccelerator кажется несколько излишним, поскольку он не требуется в трех остальных функциях цикла обработки сообщений. Более того, в самой структуре сообщения (переменная структуры msg) имеется член с именем hwnd, который является описателем окна. Отличия обусловлены следующим.

Поля структуры msg заполняются при вызове функции GetMessage. Если второй параметр функции GetMessage равен NULL, то функция извлекает сообщения всех окон, принадлежащих приложению. При возвращении из функции GetMessage, число hwnd структуры msg является описателем того окна, которое получит сообщение. Однако, когда функция TranslateAccelerator преобразует сообщение клавиатуры в сообщение WM_COMMAND илиWM_SYSCOMMAND, она заменяет описатель окна msg.hwnd описателем hwnd, заданным в качестве первого параметра функции. Таким образом, Windows посылает все сообщения быстрых клавиш одной оконной процедуре, даже если в данный момент фокус ввода имеет другое окно приложения. Функция TranslateAccelerator не преобразует сообщения клавиатуры, когда модальное окно диалога или окно сообщений имеет фокус ввода. Это происходит, потому что сообщения для этих окон не проходят через цикл обработки сообщений программы.

В некоторых случаях, когда какое-то другое окно вашей программы (например, немодальное окно диалога) имеет фокус ввода, нажатия быстрых клавиш можно не преобразовывать.

Получение сообщений быстрых клавиш

Если быстрая клавиша связана с пунктом системного меню, функция TranslateAccelerator    посылает    оконной    процедуре    сообщение WM_SYSCOMMAND. В противном случае функция TranslateAccelerator посылает оконной процедуре сообщение WM_COMMAND. В следующей таблице показаны типы сообщений WM_COMMAND, которые можно получить для быстрых клавиш, команд меню и дочерних окон управления:

Младшее слово (LOWORD) (wParam)

Старшее слово (HIWORD) (wParam)

IParam

Быстрая клавиша:

Идентификатор быстрой клавиши

1

0

Меню:

Идентификатор меню

0

0

Элемент управления:

Идентификатор элемента управления

Код уведомления

Описатель дочернего окна

Кроме этого, если быстрая клавиша соответствует пункту меню, оконная процедура получает сообщения WM_NITMENU, WM_NITMENUPOPUP и WM_MENUSELECT точно также, как при выборе опции меню. Обычно, в программах при обработке сообщений WM_INITMENUPOPUP делают разрешенными и запрещенными пункты всплывающих меню. При работе с быстрыми клавишами эта возможность по-прежнему имеется. Однако если быстрая клавиша соответствует запрещенному или недоступному пункту меню, то функция TranslateAccelerator не посылает оконной процедуре сообщение WM_COMMAND или WM_SYSCOMMAND.

При сворачивании активного окна для быстрых клавиш, соответствующих разрешенным пунктам системного меню, функция TranslateAccelerator посылает оконной процедуре сообщения WM_SYSCOMMAND, а не сообщения WM_COMMAND. Кроме того, функция TranslateAccelerator посылает оконной процедуре сообщения WM_COMMAND для быстрых клавиш, которые не соответствуют ни одному из пунктов меню.


 

А также другие работы, которые могут Вас заинтересовать

2923. Висячие мосты 1.64 MB
  Висячий мост — мост, в котором основная несущая конструкция выполнена из гибких элементов (кабелей, канатов, цепей и др.), работающих на растяжение, а проезжая часть подвешена. Работа висячих конструкций на растяжение позволяет полностью...
2924. Зарубежный опыт права на отказ от военной службы по убеждениям совести 143.5 KB
  Данная работа является стремлением автора создать теоретическую базу для практической работы по защите прав призывников в рамках Нижегородского Общества Защиты Прав Человека (НОПЧ). Необходимо отметить, что такая работа членами Нижегородского Общест...
2925. Реструктуризация предприятия на примере НК НПЗ 616 KB
  Реформирование экономических отношений в России связано с решением ряда сложнейших проблем как теоретического, так и организационного характера. Прежде всего это внедрение теории и практики менеджмента, маркетинга и правовой базы, которые обеспечат...
2926. Фельетон как публицистический жанр 109.5 KB
  В творчестве, как известно, нет лёгких путей, но особенно трудно сатирику. Может быть, труднее, чем кому бы то ни было из его собратьев по перу. Призвание сатирика – срывать улыбчивые и благочестивые маски, обнажая скрытый под ними хищный оскал...
2927. Свойства машиностроительных материалов 269.5 KB
  Конструкционные стали и сплавы Конструкционными называются стали, предназначенные для изготовления деталей машин (машиностроительные стали), конструкций и сооружений (строительные стали). Углеродистые конструкционные стали Углеродистые конс...
2928. Эволюция понятий техника и технология 67.14 KB
  Понятие технология используется в разных областях знания, оно употребляется в науке, искусстве, промышленности и поэтому подходов к его трактовке известно довольно много. На заре развития человечества решались отдельные технологические зада...
2929. Безопасность жизнедеятельности в экстремальных ситуациях 46.12 KB
  Стихийные бедствия, промышленные аварии и катастрофы на транспорте, экологические последствия антропогенного воздействия на биосферу, применение противником в случае военных действий различных видов оружия, создают ситуации, опасные для жиз...
2930. Денежная реформа 1895—1897 годов 29.99 KB
  Денежная реформа 1895—1897 годов Среди реформ С.Ю. Витте, естественно, наибольший интерес вызывает опыт стабилизации российского рубля. Конечно, современный мир и экономика качественно отличаются от образцов...
2931. Оптическая плотность оттиска. Влияние технологических добавок для офсетных красок на параметры отпечатка 64.88 KB
  Оптическая плотность оттиска. Влияние технологических добавок для офсетных красок на параметры отпечатка. Влияние технологических добавок для офсетных красок на параметры отпечатка В технических описаниях практически любой современной серии печатных красок для листового офсета указывается, что краски поставляются готовыми к применению...