Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

Глава 5 Клавиатура

5

 

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

Клавиатура не может рассматриваться исключительно как устройство для ввода информации, изолированно от других функций программы. Например, программы часто повторяют ввод с клавиатуры путем отображения печатаемых символов в рабочей области окна. Таким образом, обработка ввода с клавиатуры и вывод текста должны рассматриваться совместно. Если вам важно адаптировать ваши программы к иностранным языкам и рынкам, вам также нужно знать о том, как Windows 95 поддерживает расширенный набор символов ASCII (коды от 128 и выше), двухбайтные наборы символов (DBCS), и поддерживаемую Windows NT 16-разрядную кодировку клавиатуры, известную как Unicode.

Клавиатура. Основные понятия

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

На самом деле все происходит не столь просто: когда пользователь нажимает и отпускает клавиши, драйвер клавиатуры передает информацию о нажатии клавиш в Windows. Windows сохраняет эту информацию (в виде сообщений) в системной очереди сообщений. Затем она передает сообщения клавиатуры, по одному за раз, в очередь сообщений программы, содержащей окно, имеющее "фокус ввода" (input focus) (о котором вскоре будет рассказано). Затем программа отправляет сообщения соответствующей оконной процедуре.

Смысл этого двухступенчатого процесса — сохранение сообщений в системной очереди сообщений, и дальнейшая их передача в очередь сообщений приложения — в синхронизации. Если пользователь печатает на клавиатуре быстрее, чем программа может обрабатывать поступающую информацию, Windows сохраняет информацию о дополнительных нажатиях клавиш в системной очереди сообщений, поскольку одно из этих дополнительных нажатий может быть переключением фокуса ввода на другую программу. Информацию о последующих нажатиях следует затем направлять в другую программу. Таким образом Windows корректно синхронизирует такие сообщения клавиатуры.

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

Игнорирование клавиатуры

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

172

Программе не нужно отслеживать нажатие этих клавиш, поскольку Windows извещает программу об эффекте, вызванном их нажатием. (Однако, при желании программа сама может их отслеживать.) Например, когда пользователь Windows выбирает пункт меню с помощью клавиатуры, Windows посылает программе сообщение, что выбран пункт меню, независимо от того, был ли он выбран с помощью мыши, или с помощью клавиатуры. (О работе с меню рассказывается в главе 10.)

В некоторых программах для Windows используются "быстрые клавиши" (keyboard accelerators) для быстрого доступа к часто употребляемым пунктам меню. В качестве быстрых клавиш обычно используются функциональные клавиши или комбинация символьной клавиши и клавиши <Ctrl>. Такие быстрые клавиши определяются в описании ресурсов программы. (В главе 10 показано, как Windows преобразует быстрые клавиши в сообщения команд меню. Вам не нужно самим делать это преобразование.)

Окна диалога (о которых рассказывается в главе 11) также имеют интерфейс клавиатуры, но обычно программам не нужно отслеживать клавиатурные события, когда активно окно диалога. Интерфейс клавиатуры обслуживается самой Windows, и Windows посылает сообщения вашей программе о действиях, соответствующих нажимаемым клавишам. В окнах диалога могут содержаться "окна редактирования" (edit) для ввода текста. Это обычно небольшие окна, в которых пользователь набирает строки символов. Windows управляет всей логикой окон редактирования и дает вашей программе окончательное содержимое этих окон, после того, как пользователь завершит ввод строки.

Даже внутри вашего главного окна вы можете определить дочерние окна как окна редактирования. Особым примером этого является программа POPPAD, представленная в главе 8. Эта программа практически представляет собой просто большое окно редактирования, причем вся черновая работа в ней возложена на Windows.

Фокус ввода

Клавиатура должна разделяться между всеми приложениями, работающими под Windows. Некоторые приложения могут иметь больше одного окна, и клавиатура должна разделяться между этими окнами в рамках одного и того же приложения. Когда на клавиатуре нажата клавиша, только одна оконная процедура может получить сообщение об этом. Окно, которое получает это сообщение клавиатуры, является окном, имеющем "фокус ввода" (input focus).

Концепция фокуса ввода тесно связана с концепцией "активного окна". Окно, имеющее фокус ввода — это либо активное окно, либо дочернее окно активного окна. Определить активное окно обычно достаточно просто. Если у активного окна имеется панель заголовка, то Windows выделяет ее. Если у активного окна вместо панели заголовка имеется рамка диалога (это наиболее часто встречается в окнах диалога), то Windows выделяет ее. Если активное окно минимизировано, то Windows выделяет текст заголовка в панели задач.

Наиболее часто дочерними окнами являются кнопки, переключатели, флажки, полосы прокрутки и списки, которые обычно присутствуют в окне диалога. Сами по себе дочерние окна никогда не могут быть активными. Если фокус ввода находится в дочернем окне, то активным является родительское окно этого дочернего окна. То, что фокус ввода находится в дочерних окнах, обычно показывается посредством мигающего курсора или каретки

(caret).

Если активное окно минимизировано, то окна с фокусом ввода нет. Windows продолжает слать программе сообщения клавиатуры, но эти сообщения выглядят иначе, чем сообщения, направленные активным и еще не минимизированным окнам.

Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, оконная процедура может определить, когда окно имеет фокус ввода. WM_SETFOCUS показывает, что окно получило фокус ввода, а WM_KILLFOCUS, что окно потеряло его.

Аппаратные и символьные сообщения

Сообщения, которые приложение получает от Windows о событиях, относящихся к клавиатуре, различаются на "аппаратные" (keystrokes) и "символьные" (characters). Такое положение соответствует двум представлениям о клавиатуре. Во-первых, вы можете считать клавиатуру набором клавиш. В клавиатуре имеется только одна клавиша <A>. Нажатие на эту клавишу является аппаратным событием. Отпускание этой клавиши является аппаратным событием. Но клавиатура также является устройством ввода, генерирующем отображаемые символы. Клавиша <А>, в зависимости от состояния клавиш <Ctrl>, <Shift> и <CapsLock>, может стать источником нескольких символов. Обычно, этим символом является строчное ‘a’. Если нажата клавиша <Shift> или установлен режим Caps Lock, то этим символом является прописное <А>. Если нажата клавиша <Ctrl>, этим символом является <Ctrl>+<А>. На клавиатуре, поддерживающей иностранные языки, аппаратному событию ‘А’ может предшествовать либо специальная клавиша, либо <Shift>, либо <Ctrl>, либо <Alt>, либо их различные сочетания. Эти сочетания могут стать источником вывода строчного ‘а’ или прописного ‘А’ с символом ударения.

Для сочетаний аппаратных событий, которые генерируют отображаемые символы, Windows посылает программе и оба аппаратных и символьное сообщения. Некоторые клавиши не генерируют символов. Это такие клавиши, как

Соседние файлы в предмете Операционные системы