Руководство программиста в Photon (1037671), страница 22
Текст из файла (страница 22)
Горячая клавиша (только для ответных реакций горячих клавиш)
Клавиатурная клавиша и модификатор (такой как <Alt> или <Ctrl>), которые запускают ответную реакцию. См. раздел "Ответные реакции горячих клавиш".
Маска событий (только для обработчиков событий)
Позволяет Вам задавать, какие события Photon'а являются чувствительными для виджета. См. "Обработчики событий – необработанные и отфильтрованные ответные реакции".
Функции ответных реакций хрянятся в заготовочных файлах
Когда Вы задаёте функцию ответной реакции, PhAB генерирует заготовку функции; для получения информации по заданию языка (С или С++) и имени файла, см. раздел "Имена функций и файлов" в главе "Работа с программным кодом".
Ответные реакции горячих клавиш
Виджеты поддерживают ответные реакции горячих клавиш. Эти ответные реакции позволяют Вам присоединить клавиши клавиатуры к заданным функциям ответных реакций. Когда окно приложения получает фокус, горячие клавиши становятся активными. Нажатие такой клавиши вызывает соответствующую связанную с горячей клавишей ответную реакцию.
Этот раздел включает:
-
Горячие клавиши – основы
-
Задание метки горячей клавиши
-
Задание ответной реакции
-
Обработка горячей клавиши
-
Отключение ответной реакции
Горячие клавиши – основы
Вот некоторая основная информация о горячих клавишах:
-
Горячие клавиши – это комбинация клавиши символа и ключа-модификатора (<Alt>, <Shift> или <Ctrl>). По большей части для горячих клавиш используется <Alt>.
-
Вы можете использовать в качестве горячей клавиши модификатор сам по себе, однако это, по-видимому, не является хорошей идеей.
-
Горячая клавиша не вызывается, если блокирован какой-либо прародитель виджета, которому она принадлежит.
-
Горячая клавиша обрабатывается после того, как виджет получает событие клавиши. Если виджет поглощает событие, никакая ответная реакция горячей клавиши не вызывается. Так, когда текстовая область получает фокус, клавиша <Enter>, клавиши стрелок, клавиша пробела и все отображаемые символы не работают как горячие клавиши, поскольку виджет поглощает эти события. Это обычно является требуемым поведением (предполагать редактирование в приложении, все клавиши стрелок в котором определены как горячие).
Вы можете заставить обрабатывать горячие клавиши прежде получения события, установив Pt_HOTKEYS_FIRST в ресурсе Pt_ARG_CONTAINER_FLAGS контейнера виджета (окна, панели, ...), содержащего виджеты, которые обычно поглощают возможные события горячих клавиш. Установка этого флага в окне гарантирует, что все горячие клавиши будут обработаны до того, как какой-либо виджет получит событие нажатия клавиши. Для получения более полной информации см. ниже раздел "Обработка горячих клавиш".
-
Чтобы горячие клавиши виджетов были активны, эти виджеты должны быть выбираемы (за исключением расчленённых виджетов, таких как окна или меню). Убедитесь, что в ресурсах Pt_ARG_FLAGS виджетов установлены флаги Pt_SELECTABLE и Pt_GETS_FOCUS.
Если виджеты обычно не являются выбираемыми и Вы не желаете, чтобы их внешний вид изменился при выборе, Вы должны также установить флаг Pt_SELECT_NOREDRAW виджета.
-
Часто не имеет значения, с каким виджетом связана ответная реакция. В этих случаях просто присоедините ответную реакцию к окну.
Задание метки горячей клавиши
Установки горячей клавиши недостаточно – Вам необходимо сообщить пользователю об этом. Вы должны отобразить метку горячей клавиши на виджете, вызываемом горячей клавишей:
-
Для большинства виджетов отредактируйте ресурс клавиши быстрого доступа (Pt_ARG_ACCEL_KEY). Задайте символ в метке виджета, который Вы хотите подчеркнуть. Вы не можете включить в метку какую-либо клавишу-модификатор.
-
Для пунктов меню подчёркнутый символ является кнопкой быстрого доступа, которую Вы можете использовать для выбора пункта, когда отображено меню. Метка горячей клавиши отображается отдельно, справа от метки пункта меню. Задайте горячую клавишу (включая клавиши-модификаторы) в области "Accel Text" редактора меню.
Задание ответной реакции
В PhAB каждый список ответных реакций виджета отображает вход, называемый "Hotkey" или Pt_CB_HOTKEY, который используется для определения горячих клавиш. Перед тем как определить горячую клавишу, Вам необходимо определить, где это сделать. Где Вы определите ответную реакцию горячей клавиши, зависит от того:
-
где должен появиться модуль (такой как меню)
-
какой виджет Вам нужен в функции ответной реакции
-
куда пойдёт пользователь, чтобы нажать горячую клавишу
Где должен появиться модуль
Когда Вы определяете горячую клавишу, Вы можете задать, где появиться модулю. Например, если горячая клавиша предназначена для отображения модуля меню, связанного с виджетом PtModuleButton в Вашем PtMenuBar окна, определите горячую клавишу в кнопке меню. Используйте "Location dialog", чтобы меню появилось под кнопкой меню. Для получения более полной информации см. раздел "Позиционирование модуля" в главе "Работа с модулями".
Какой виджет Вам нужен в функции ответной реакции
Виджет, имеющий ответную реакцию, является подходящим для функции ответной реакции.
Куда идти пользователю, чтобы нажать горячую клавишу
Например, если горячая клавиша является быстрым входом в пункт меню, добавьте горячую клавишу к окну, в котором меню используется, а не к модулю меню.
| Горячие клавиши в данном модуле должны быть уникальны. Если Вы определили некую клавишу более одного раза, используется последнее определение. |
Если Вы разрабатываете многоязычное приложение, Вам понадобятся различные наборы горячих клавиш для каждого языка. См. главу "Поддержка международных языков". |
Когда Вы выбираете ответную реакцию Pt_CB_HOTKEY, всплывает редактор ответных связей с областью "Hotkey" в зоне связанной информации:
Рис. 6-11. Область "Hotkey" в редакторе ответных реакций
При создании ответных реакций горячей клавиши Вы должны заполнить область "Hotkey". Есть два пути установить горячую клавишу: один простой, другой не очень.
-
«не такой уж простой способ» – Вы можете набрать значение горячей клавиши в шестнадцатеричном формате в области "Hotkey". Чтобы найти значение для клавиши, которую Вы хотите использовать, посмотрите хеадер-файл <photon/PkKeyDef.h> и найдите имя клавиши, предварённое префиксом Pk_.
Используйте для горячих клавиш прописные буквы; заглавные не будут работать. Например, для горячей клавиши <Alt>+<F> смотри шестнадцатеричное значение не для Pk_F, а для Pk_f.
Область имеет также три переключающиеся кнопки – "Ctrl", "Shift" и "Alt", позволяющие Вам задать модификатор для горячей клавиши.
-
«простой способ» – нажмите кнопку справа от кнопки-переключателя "Alt", затем нажмите сочетание клавиш, которое Вы хотите использовать в качестве горячей клавиши. PhAB автоматически определит клавишу и модификатор, которые Вы нажали.
Обработка горячих клавиш
Вот как работает горячая клавиша:
-
когда событие клавиши достигает окна, окно направляет событие своим порождённым виджетам;
-
если порождение это событие поглощает, ничего больше не происходит;
-
в противном случае событие проверяется в списке горячих клавиш окна. Если горячая клавиша найдена, вызывается ответная реакция;
-
если ответная реакция не найдена, просматривается список горячих клавиш родительского окна, и далее наверх по иерархии окон.
Ресурс Pt_ARG_CONTAINER_FLAGS виджетов контейнерного класса включает несколько флагов, оказывающих влияние на обработку горячих клавиш:
Pt_HOTKEY_TERMINATOR
Не допускает проход поиска горячей клавиши наверх к родительскому контейнеру. Флаг Pt_HOTKEY_TERMINATOR работает, только если он установлен в разобранном виджете контейнерного класса.
Pt_HOTKEYS_FIRST
Обработка событий клавиш, достигших контейнера, как горячих клавиш, перед тем как они проходят к потомкам контейнера. Если событие является горячей клавишей, оно поглощается, т.е. не проходит к потомкам.
Отключение горячих клавиш
Выдача пользователю визуальной индикации, что горячая клавиша отключена, отличается от действительного отключения горячей клавиши.
Для того, чтобы выдать визуальную индикацию, используйте технологию, соответствующую виджету:
-
если горячая клавиша присоединена к кнопке, установите флаг Pt_GHOST и снимите флаги Pt_SELECTABLE и Pt_GETS_FOCUS в ресурсе кнопки Pt_ARG_FLAGS;
-
если горячая клавиша присоединена к пункту меню, созданному в PhAB, вызовите ApModifyItemState();
-
...
Чтобы оключить горячую клавишу, используйте одну из следующих технологий:
-
Не отключайте горячую клавишу. Вместо этого, в качестве первого, что должно быть выполнено в программном коде ответной реакции горячей клавиши, введите проверку на нечто, что должно быть сделано. Если это не сделано, просто вернитесь из ответной реакции. Например, если ответные реакции горячей клавиши – это "вклеить" текст, проверьте, есть ли что "вклеивать". Если нечего, просто вернитесь
или
-
За исключением разобранных виджетов, если виджет, к которому присоединена ответная реакция горячей клавиши, не является выбираемым, горячая клавиша обрабатывается так, как будто она не существует. Чтобы виджет был выбираемым, должен быть установлен флаг Pt_SELECTABLE в ресурсе Pt_ARG_FLAGS.
Хорошим основанием для такого подхода является то, что это работает, даже если Ваше приложение имеет одну и ту же горячую клавишу, описанную более чем в одном окне. Например, мы можем иметь меню "Edit" в базовом окне и кнопку "Erase" в порождённом окне, оба с сочетанием <Alt>+<E> в качестве горячей клавиши. Если в текущий момент фокус имеет порождённое окно и пользователь нажимает <Alt>+<E>, вызывается ответная реакция кнопки "Erase" порождённого окна.
Теперь, если мы отменим кнопку "Erase" в порождённом окне, мы хотим использовать <Alt>+<E> для того, чтобы появилось меню "Edit" базового окна. В этом сценарии, пока кнопка "Erase" является выбираемой, будет вызываться её ответная реакция. Поэтому мы просто делаем кнопку "Erase" невыбираемой. Теперь, когда пользователь нажимает <Alt>+<E>, появляется меню "Edit" базового окна, даже при том, что порождённое окно ещё имеет фокус.
или
-
Вы можете вызвать PtRemoveHotkeyHandler(), чтобы удалить горячую клавишу, и впоследствии вызвать PtAddHotkeyHandler(), чтобы включить её снова.
Обработчики событий – необработанные и отфильтрованные ответные реакции
Обработчики событий позволяют Вам реагировать непосредственно на события Photon'а. Вы можете присоединить обработчики событий к любому виджету; они похожи на другие ответные реакции виджета, но с дополнением в виде маски событий. Используя эту маску, Вы можете выбрать, какие события будут получать Ваши ответные реакции.
Вы найдёте это крайне полезным для получения событий Pt_EV_DRAG для конкретного окна. Для получения более подробной информации по перетаскиванию см. раздел "Перетаскивание" в главе "События".
Pt_Widget определяет следующие ресурсы обработки событий:
Pt_CB_FILTER | Вызывается перед тем, как событие достигло виджета |
Pt_CB_RAW | Вызывается после того, как виджет обработал событие (даже если виджет поглотил событие) |
Описание необработанных и отфильтрованных обработчиков событий и их использования см. в разделе "Обработчики событий – необработанные и отфильтрованные ответные реакции" в главе "События".
Для получения более подробной информации о добавлении обработчиков событий в программный код приложения см. "Обработчики событий" в главе "Управление виджетами в программном коде приложения".
Чтобы присоединить необработанную или отфильтрованную ответную реакцию:
-
Выберите виджет, затем переключитесь, если необходимо, в панель управления ответными реакциями.
-
Щёлкните на ресурсе Pt_CB_RAW (необработанные события) или Pt_CB_FILTER (отфильтрованные), чтобы открыть редактор ответных реакций.
-
Всплывёт редактор с областью "Event Mask" в зоне связанной информации:
Рис. 6-12. Область маски событий в редакторе ответных реакций
Область маски событий позволяет Вам задавать, к каким событиям Photon'а должен быть чувствителен виджет. Если случается любое из этих низкоуровневых событий, виджет вызывает ответную реакцию.
Щёлкните на иконке рядом с этой областью, чтобы открыть селектор событий:
Рис. 6-13. Селектор событий
-
Выберите события, к которым должен быть чувствителен виджет, затем закройте селектор.
Для получения более полной информации см. типы событий, описанные в структуре PhEvent_t в "Справочнике библиотеки Photon'а".
Глава 7. Управление геометрией
Эта глава описывает, как задать или точно регулировать геометрию Ваших виджетов.
Она включает:
-
Контейнер виджетов
-
Согласование геометрии
-
Абсолютное позиционирование
-
Выравнивание виджетов с использованием групп
-
Удерживающее управление с использованием анкеров
-
Удерживание позиции или ограничение изменения размеров без анкеров
Контейнер виджетов
Контейнерный виджет является порождением виджетного класса PtContainer. Контейнерными виджетами являются только те виджеты, которые могут иметь потомков. Любой виджет, не имеющий окна в своём владении, всегда визуализируется внутри границ своего родителя. Только виджеты, принадлежащие к производному классу от виджетного класса PtWindow, получают в свою собственность окно.
Контейнерные виджеты отвечают за выполнение управления геометрией. Первой обязанностью контейнерного виджета является позиционирование каждого потомка и установка его размеров так, чтобы обеспечить желаемое расположение для всех своих потомков. Контейнер также может накладывать на своих потомков ограничения по размерам (например, заставляет их все быть одного и того же размера). Кроме того, контейнер должен ограничивать потомков так, чтобы они не появлялись вне границ контейнера. Обычно это достигается путём обрезания потомков.