Символьные сообщения
Идея самостоятельного преобразования аппаратных сообщений клавиатуры в символьные сообщения путем учета информации о положении клавиш сдвига является достаточно непродуктивной в силу того, информации о положении этих клавиш недостаточно – необходимо знать об особенностях реализации каждой отдельной национальной клавиатуры.
За программиста это делает Windows. Ранее уже встречался следующий код:
while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMesage(&msg); }Это типичный цикл обработки сообщений, содержащийся в WinMain. Функция GetMessage заполняет поля структуры msg данными следующего сообщения из очереди. Вызов DispatchMesage вызывает соответствующую оконную процедуру. Между двумя этими функциями находится функция TranslateMessage.
Функция TranslateMessage преобразует аппаратные сообщения клавиатуры в символьные сообщения. Если этим сообщением является WM_KEYDOWN (WM_SYSKEYDOWN) и, если нажатие клавиши в сочетании с положением клавиши сдвига генерирует символ, тогда TranslateMessage помещает символьное сообщение в очередь сообщений.
- Это символьное сообщение будет следующим, после сообщения о нажатии клавиши, которое функция GetMessage извлечет из очереди.
Вид символьных сообщений: несистемные – WM_CHAR,системные – WM_SYSCHAR.
- Сообщения WM_SYSCHAR являются следствием сообщений WM_SYSKEYDOWN.
В большинстве случаев программы для Windows могут игнорировать все сообщения за исключением WM_CHAR.
- Параметр lParam, передаваемый в оконную процедуру как часть символьного сообщения, является таким же, как и параметр lParam аппаратного сообщения клавиатуры, из которого сгенерировано символьное сообщение. Параметр wParam – это код символа ASCII.
Если Windows приложению необходимо обрабатывать символы клавиатуры, то ему придется обрабатывать сообщение WM_CHAR. Наиболее типичным кодом обработки сообщения WM_CHAR является следующий код:
case WM_CHAR: { char chCharCode = (char) wParam; // ASCII-код символа switch(chCharCode) { case ‘\b’: . . .; // введен символ Backspace break; case ‘\t’: . . .; // введен символ Tab break; case ‘\r’: . . .; // введен символ Enter break; case ‘A’: . . .; // введен прописной символ A break; case ‘a’: . . .; // введен строчныйо символ а break; … default: . . .; // введены другие символы break; } }; return 0;Замечание. Программы обычно могут игнорировать WM_DEADCHAR и WM_SYSDEADCHAR. На некоторых, неамериканских клавиатуры, некоторые клавиши определяются добавлением диакритического знака к букве. Они называются немыми клавишами(dead keys), поскольку эти клавиши сами по себе не определяют символов.
Рассмотрим, с какими наборами символов работает система Windows. В операционной системе MS-DOS использовался расширенный набор символов, определенный фирмой IBM. В этот набор входят буквы английского алфавита, знаки пунктуации и псевдографики.
Для обеспечения возможности работы с символами кириллицы фирма Microsoft разработала расширенный набор символов с кириллицей. В терминологии Windows такие таблицы кодов называются наборами символов OEM (Original Equipment Manufacturer).
Сама же система Windows для представления символов использует набор символов ANSI. В этом наборе определены не все коды и отсутствуют символы псевдографики.
Если программа MS-DOS запускается в окне Windows, для нее выбирается набор символов OEM. Поэтому
- В Windows используются как набор символов ANSI, так и набор символов OEM. По умолчанию в контекст отображения выбирается системный шрифт, для которого используется набор символов ANSI.
Для одинаковых символов наборы ANSI и OEM используют разные коды, это приводит к необходимости перекодировки символов, например, при переносе текстов, подготовленных в среде MS-DOS, в среду Windows. В составе программного интерфейса Windows имеются функции, которые берут на себя работу по преобразованию и перекодировке символов.
Работа с мышью
Определить присутствие мыши можно с помощью функции GetSystemMetrics, передав ей в качестве параметра значение SM_MOUSEPRESENT. Если мышь есть, эта функция возвращает ненулевое значение.
- Для определения количества кнопок можно использовать вызов GetSystemMetrics с параметром SM_CMOUSEBUTTONS.
Когда пользователь перемещает мышь, Windows перемещает по экрану растровую картинку, которая называется курсор мыши (mouse cursor). Курсор мыши(растровая картинка) имеет вершину (hot spot) размером в один пиксель, точно указывающий положение мыши на экране.
В драйвере дисплея содержатся несколько предопределенных курсоров мыши, которые могут использоваться в программах. Наиболее типичным курсором является наклонная стрелка, которая называется IDC_ARROW (вершина курсора – острие стрелки). Курсор IDC_WAIT в виде песочных часов обычно используется для индикации того, что программа чем-то занята.
Замечание.Программисты могут сами проектировать свои собственные курсоры (эта возможность рассматривается в материалах занятия, посвященного ресурсам приложения).
Курсор, устанавливаемый по умолчанию для конкретного окна, задается при определении структуры класс окна:
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);Приведем определения терминов, соответствующих действиям пользователя над кнопками мыши:
- Щелчок – нажатие и отпускание кнопки мыши.
- Двойной щелчок – двойное быстрое, идущее одно за другим, нажатие и отпускание кнопки мыши.
- Перетаскивание – перемещение мыши при нажатой кнопке.
Дата добавления: 2017-01-26; просмотров: 1892;