Главная :: Программы для программирования :: wxWidgets :: Перевод книги "Programming with wxWidgets" :: Глава 6 – Обработка данных с устройств ввода. Часть 4
Plug&Pray

Глава 6 – Обработка данных с устройств ввода. Часть 4

6.2.1 Пример обработчика события ввода символа

Ниже представлен обработчик клавиш из примера wxThumbnailCtrl, который вы можете найти в папке examples/chap12/thumbnail на прилагаемом CD-ROM’е.

BEGIN_EVENT_TABLE( wxThumbnailCtrl, wxScrolledWindow ) EVT_CHAR(wxThumbnailCtrl::OnChar) END_EVENT_TABLE() void wxThumbnailCtrl::OnChar(wxKeyEvent& event) { int flags = 0; if (event.ControlDown()) flags |= wxTHUMBNAIL_CTRL_DOWN; if (event.ShiftDown()) flags |= wxTHUMBNAIL_SHIFT_DOWN; if (event.AltDown()) flags |= wxTHUMBNAIL_ALT_DOWN; if (event.GetKeyCode() == WXK_LEFT || event.GetKeyCode() == WXK_RIGHT || event.GetKeyCode() == WXK_UP || event.GetKeyCode() == WXK_DOWN || event.GetKeyCode() == WXK_HOME || event.GetKeyCode() == WXK_PAGEUP || event.GetKeyCode() == WXK_PAGEDOWN || event.GetKeyCode() == WXK_PRIOR || event.GetKeyCode() == WXK_NEXT || event.GetKeyCode() == WXK_END) { Navigate(event.GetKeyCode(), flags); } else if (event.GetKeyCode() == WXK_RETURN) { wxThumbnailEvent cmdEvent( wxEVT_COMMAND_THUMBNAIL_RETURN, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetFlags(flags); GetEventHandler()->ProcessEvent(cmdEvent); } else event.Skip(); }

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

6.2.2 Преобразование кода клавиши

События нажатия/отпускания предоставляют не преобразуемые коды клавиш, тогда как событие ввода символа предоставляет преобразуемый код клавиши. Не преобразуемый код для алфавитно-цифровых клавиш всегда соответствует значению верхнего регистра. Для остальных клавиш, это значения вида WXK_XXX из таблицы кодов символов. Преобразуемая клавиша, в основном является символом, пояление которого ожидает пользователь как результат комбинации клавиш при вводе в текстовое поле.

Вот несколько поясняющих примеров. Когда клавиша “А” нажата, код события нажатия равен коду “А” из таблицы ASCII (65), но код события ввода символа – ASCII “а” (97). Притом, если вы нажали “А” с Shift, код клавиши в событии нажатия по-прежнему будет “А”, в то время как код клавиши события ввода символа теперь тоже станет “А”.

В это простом случае ясно, что в обработчике события нажатия ASCII-код может быть получен путем проверки как не преобразуемого кода клавиши, так и значения, возвращенного функцией ShiftDown.

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

Другой вид преобразования происходит когда зажат Control, например, Ctrl+А. Событие нажатия передает тот же код “А”, но событие ввода символа будет иметь код “1?. Это ASCII-значение этой комбинации клавиш.

Вы можете исследовать работу других клавиш у себя в системе, запустив пример samples/keyboard и понажимав разные клавиши.

6.2.3 Разновидности клавиш-модификаторов

В ОС Windows клавиши-модификаторы это Control и Alt, а также особая win-клавиша, работающая как Meta. В ОС UNIX, клавиша, работающая как Meta настраивается (запустите утилиту xmodmap, чтобы посмотреть, как настроена ваша система).

Иногда NumLock настроена как Meta, и из за этого функция HasModifiers не возвращают значение true при удержанной клавише Meta, так как при этом нормально обрабатываются нажатия клавиш с включенным NumLock.

В Mac OS X клавиша Command (с символом apple) выполняет функции Meta, а Option — функции Alt.

Эти различия показаны в таблице 6.4, где первая колонка — название модификаторов в wxWidgets, остальные три — клавиши, используемые для этих модификаторов на основных платформах. Клавиши Mac проиллюстрированы для наглядности.

Модификатор Клавиша в Windows Клавиша в UNIX Клавиша в Mac OS X
Shift Shift Shift Shift
Control Control Control Control
Alt Alt Alt Option
Meta Windows (Настраивается) Command

Так как в Mac OS X клавиша Command используется для тех же целей, что и Control на других платформах, то можно использовать функцию CmdDown объекта wxKeyEvent вместо ControlDown или MetaDown для перехвата этих команд на разных платформах.

Следует отметить, что также можно передать код клавиши функции wxGetKeyState, чтобы проверить была ли нажата клавиша. Последняя возможность особенно полезна в обработчике событий, пришедших не от клавиатуры.

6.2.4 Акселераторы

Акселераторы — это “горячие” клавиши для различных команд меню, которые позволяют пользователю вызывать команды очень быстро. Такие горячие клавиши имеют преимущество в обработке перед другими обработчиками клавиатуры, такими как EVT_CHAR. Стандартный набор таких акселераторов включает в себя Ctrl+O (чтобы открыть файл) и Ctrl+V (чтобы вставить данные в приложение). Самый легкий способ реализовать акселераторы — определить их непосредственно в пунктах меню. Например:

menu->Append(wxID_COPY, wxT("Copy\tCtrl+C"));

wxWidgets интерпретирует текст после символа табуляции как акселератор и добавляют его в таблицу акселераторов меню. В этом примере при нажатии пользователем Ctrl+C посылается команда wxID_COPY, как будто был выбран соответствующий пункт меню.

Вы можете использовать Control, Alt или Shift в различных сочетаниях, дополняя символом или функциональной клавишей, следующими за “+” или “-”. Вот примеры правильных сочетаний клавиш-акселераторов: Ctrl+B, G, Shift-Alt-K, F9, Ctrl+F3,

Esc и Del. Вы можете использовать следущие зарезервированные имена клавиш: Del, Back, Ins, Insert, Enter, Return, PgUp, PgDn, Left, Right, Up, Down, Home, End, Space, Tab, Esc и Escape. Регистр в именах клавиш не важен (любые сочетания верхнего и нижнего регистра будут работать).

Напоминаем, что в Mac OS X описание горячих клавиш, использующих Ctrl, будет

в действительности использовать клавишу Command.

Другой способ включить акселераторы — заполнить таблицу wxAcceleratorTable

объектами wxAcceleratorEntry и связать ее с окном, используя метод wxWindow::SetAcceleratorTable. Каждый объект wxAcceleratorEntry инициализируется битовым списком модификаторов (один или несколько wxACCEL_ALT,

wxACCEL_CTRL, wxACCEL_SHIFT и wxACCEL_NORMAL), кодом клавиши (см. таблицу 6.3) и идентификатором. Например,

wxAcceleratorEntry entries[4]; entries[0].Set(wxACCEL_CTRL, (int) ’N’, wxID_NEW); entries[1].Set(wxACCEL_CTRL, (int) ’X’, wxID_EXIT); entries[2].Set(wxACCEL_SHIFT, (int) ’A’, wxID_ABOUT); entries[3].Set(wxACCEL_NORMAL, WXK_DELETE, wxID_CUT); wxAcceleratorTable accel(4, entries); frame->SetAcceleratorTable(accel);

Можно использовать несколько таблиц акселераторов в оконной иерархии, а также сочетать наборы акселераторов с определенной таблицей wxAcceleratorTable.

Это полезно, если у вас есть альтернативные акселераторы для отдельной команды, которые вы не можете целиком вписать в текст пункта меню.