Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

5.4.1 Сообщения wm_char

Если вашей Windows-программе необходимо обрабатывать символы клавиатуры (например, в программах обработки текстов или коммуникационных программах), то она будет обрабатывать сообщения WM_CHAR.

Вероятно, вы захотите как-то по-особому обрабатывать клавиши <Backspace>, <Tab> и <Enter> (и, может быть, клавишу <Linefeed>), но все остальные символы вы будете обрабатывать похожим образом:

case WM_CHAR:

switch(wParam)

{

case '\b': // забой(Backspace)

[другие строки программы]

break;

case '\t': // табуляция(Tab)

[другие строки программы]

break;

case '\n': // перевод строки(Linefeed)

[другие строки программы]

break;

case '\r': // возврат каретки(Enter)

[другие строки программы]

break;

default: // символьный код

[другие строки программы]

break;

}

return 0;

Этот фрагмент программы фактически идентичен обработке символов клавиатуры в обычных программах MS_DOS.

5.4.2 Сообщения немых символов

Программы для Windows обычно могут игнорировать сообщения WM_DEADCHAR и WM_SYSDEADCHAR. На некоторых, не американских клавиатурах, некоторые клавиши определяются добавлением диакритического знака к букве. Они называются "немыми клавишами" (dead keys), поскольку эти клавиши сами по себе не определяют символов. Например, при инсталляции немецкой клавиатуры, клавиша, находящаяся там же, где в американской клавиатуре находится клавиша <+/=>, становится немой клавишей для указания высокого звука (), при ненажатой клавише сдвига, и низкого звука (`), при нажатой клавише сдвига.

Если пользователь нажимает немую клавишу, оконная процедура получает сообщение WM_DEADCHAR с параметром wParam равным коду ASCII самого диакритического знака. Когда затем пользователь нажимает клавишу буквы (например, клавишу <А>), оконная процедура получает сообщение WM_CHAR, где параметр wParam равен коду ASCII буквы с диакритическим знаком. Таким образом, ваша программа не должна обрабатывать сообщение WM_DEADCHAR, поскольку сообщение WM_CHAR и так дает программе всю необходимую информацию. Windows имеет даже встроенную систему отслеживания ошибок: если за немой клавишей следует буква, у которой не может быть диакритического знака (например буква s), то оконная процедура получает два сообщения WM_CHAR подряд — первое с wParam равным коду ASCII самого диакритического знака (такое же значение wParam, как было передано с сообщением WM_DEADCHAR) и второе wParam равным коду ASCII буквы s.

5.6 Каретка (не курсор)

Когда вы в программе набираете текст, обычно маленький символ подчеркивания или маленький четырехугольник показывает вам место, где следующий набираемый вами символ появится на экране. Вы можете считать, что это курсор (cursor), но, если вы программируете для Windows, необходимо отказаться от такого представления. В Windows это называется "каретка" (caret). Слово же "курсор" относится к битовому образу, отражающему положение мыши на экране.

5.6.1 Функции работы с кареткой

Здесь перечислены пять основных функций работы с кареткой:

CreateCaret — создает связанную с окном каретку.

SetCaretPos — устанавливает положение каретки в окне.

ShowCaret — показывает каретку.

HideCaret — прячет каретку.

DestroyCaret — удаляет каретку.

Кроме этих, еще имеется функция получения положения каретки (GetCaretPos) и функции установки и получения частоты мигания каретки (GetCaretBlinkTime) и (SetCaretBlinkTime).

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

Вы не можете просто создать каретку при обработке сообщения WM_CREATE и удалить ее при обработке сообщения WM_DESTROY. Каретка — это то, что называется "общесистемным ресурсом" (systemwide resource). Это означает, что в системе имеется только одна каретка. И, как результат, программа при необходимости вывода каретки на экран своего окна "заимствует" ее у системы.

Серьезно ли это необычное ограничение? Конечно, нет. Подумайте: появление каретки в окне имеет смысл только в том случае, если окно имеет фокус ввода. Каретка показывает пользователю, что он может вводить в программу текст. В каждый конкретный момент времени только одно окно имеет фокус ввода, поэтому для всей системы и нужна только одна каретка.

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

Основное правило использования каретки выглядит просто: оконная процедура вызывает функцию CreateCaret при обработке сообщения WM_SETFOCUS и функцию DestroyCaret при обработке сообщения WM_KILLFOCUS.

Имеется несколько других правил: каретка создается скрытой. После вызова функции CreateCaret, оконная процедура должна вызвать функцию ShowCaret, чтобы сделать каретку видимой. В дополнение к этому, оконная процедура, когда она рисует в своем окне при обработке сообщения, отличного от WM_PAINT, должна скрыть каретку, вызвав функцию HideCaret. После того как оконная процедура закончит рисовать в своем окне, она вызывает функцию ShowCaret, чтобы снова вывести каретку на экран. Функция HideCaret имеет дополнительный эффект: если вы несколько раз вызываете HideCaret, не вызывая при этом ShowCaret, то чтобы каретка снова стала видимой, вам придется такое же количество раз вызвать функцию ShowCaret.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]