Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Изменение формы указателя мышиСодержание книги
Поиск на нашем сайте
Изменить форму указателя мыши при прохождении над клиентской областью окна можно с помощью обработчика сообщения WM_SETCURSOR, посылаемого окну в качестве запроса для настройки формы указателя. В этом обработчике можно вызвать функцию::SetCursor с дескриптором указателя в качестве параметра. Допустим, дескриптор указателя мыши хранится в переменной-члене CMainWindow::m_hCursor. Тогда включить этот указатель над клиентской областью CMainWindow можно так:
Дескриптор указателя мыши генерируется либо при загрузке стандартного указателя, либо указателя, нарисованного в редакторе пиктограмм Developer Studio. Загрузка стандартных указателей (у них есть предопределенные числовые идентификаторы, например IDC_ARROW или IDC_CROSS) выполняется функцией CWinApp::LoadStandardCursor, которой передается один из идентификаторов стандартных указателей. При вызове:
будет возвращен дескриптор указателя-стрелки, наиболее часто используемого в Windows. Полный список стандартных указателей можно получить в справке по функции CWinApp::LoadStandardCursor. Функции CWinApp::LoadCursor можно передать идентификатор указателя, который вы самостоятельно разработали в редакторе пиктограмм Developer Studio. В приложениях принято во время выполнения длительных действий показывать указатель в виде песочных часов, обозначающий, что приложение "занято". Для песочных часов есть стандартный указатель с идентификатором IDC_WAIT. Такой указатель можно создать даже проще, чем функцией LoadStandardCursor – с помощью специального класса MFC CWaitCursor. Можно создать объект этого класса в стеке, например:
В конструкторе CWaitCursor указатель в форме песочных часов выводится на экран, а в деструкторе восстанавливается предыдущий указатель. Если вы хотите восстановить форму указателя еще до выхода из области видимости объекта CWaitCursor, то можно просто вызвать функцию-член CWaitCursor::Restore. Например, это надо делать перед выводом диалогового или информационного окна.
Получение данных с клавиатуры Приложения Windows узнают о клавиатурных событиях так же, как и о событиях мыши: посредством сообщений. Как и мышь, клавиатура является ресурсом, который с помощью операционной системы разделяется между несколькими приложениями. Сообщения мыши посылаются окну, над которым находится указатель. Сообщения клавиатуры посылаются окну, находящемуся в "фокусе ввода". Такое окно может быть только одно. При каждом нажатии или отпускании клавиши приложение в "фокусе ввода" получает сообщение. Если требуется знать, когда нажата или отпущена конкретная клавиша, например, PgUp, программа может выполнять обработку сообщений WM_KEYDOWN/WM_KEYUP с проверкой кода клавиши, сопровождающего это сообщение. Если же программе требуются не коды клавиш, а символы, то она должна игнорировать сообщения о нажатии/отпускании клавиш, а обрабатывать сообщения WM_CHAR, в которых передаются печатаемые символы. Они уже сформированы с учетом раскладки клавиатуры, текущего языка и состояния клавиш Shift и Caps Lock. Текстовый курсор в Windows называется caret.. Обычно курсор выглядит как вертикальная мерцающая черточка. Приложения, которые пользуются им, должны включать курсор при получении фокуса (сообщение WM_SETFOCUS) и выключать при потере (WM_KILLFOCUS). В классе CWnd есть набор функций для работы с текстовым курсором, например, ShowCaret (включение курсора), HideCaret (выключение курсора) и SetCaretPos (задание позиции курсора). Эти функции используются довольно редко, поэтому подробно не рассматриваются.
Сообщения о нажатии клавиш Windows информирует окно, находящееся в фокусе ввода, о нажатии и отпускании клавиш сообщениями WM_KEYDOWN и WM_KEYUP. Эти сообщения генерируются всеми клавишами, кроме Alt и F10 – "системных" клавиш, выполняющих в Windows служебные действия. Эти клавиши генерируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP. При нажатой клавише Alt любые другие клавиши тоже генерируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP (вместо WM_KEYDOWN/WM_KEYUP). Обработчики клавиатурных сообщений в MFC называются OnKeyDown, OnKeyUp, OnSysKeyDown и OnSysKeyUp (им соответствуют макросы карты сообщений ON_WM_KEYDOWN, ON_WM_KEYUP, ON_WM_SYSKEYDOWN и ON_WM_SYSKEYUP). Этим обработчикам передается вспомогательная информация, в том числе код клавиши. Все клавиатурные обработчики имеют одинаковый прототип:
nChar – это код виртуальной клавиши, которая была нажата или отпущена, nRepCnt – количество повторений нажатия/отпускания (обычно равно 1 для WM_KEYDOWN и всегда равно 1 для WM_KEYUP). Большинство программ nRepCnt игнорируют. Значение nFlags содержит аппаратный скан-код клавиши и, возможно некоторые битовые флаги, например, признак нажатой клавиши Alt. Коды виртуальных клавиш позволяют идентифицировать клавиши независимо от кодов, посылаемых клавиатурой конкретной модели. Для буквенных клавиш эти коды совпадают с кодами символов ASCII, например, от 0x41 до 0x5A для английских заглавных букв от A до Z. Остальные коды виртуальных клавиш определены как константы в файле Winuser.h. Имена констант начинаются с VK_ (см. табл. 6.4). Таблица 6.4. Некоторые коды виртуальных клавиш
Состояние клавиш Внутри обработчиков клавиатурных сообщений иногда бывает нужно узнать состояние клавиш Shift, Ctrl или Alt. Это можно сделать с помощью функции::GetKeyState. которой передается код виртуальной клавиши,. Например, чтобы узнать, нажата ли клавиша Shift, надо вызвать функцию:
Она вернет отрицательное значение, если Shift нажата, и неотрицательное – если не нажата (признак нажатия обозначается старшим битом возвращаемого числа). Чтобы выполнить некоторые действия по комбинации клавиш Ctrl+стрелка влево, можно в обработчике OnKeyDown выполнить проверку:
Функция::GetKeyState возвращает состояние клавиши или кнопки мыши на момент генерации клавиатурного сообщения. Чтобы узнать состояние в текущий момент, например, за пределами обработчика сообщения мыши или клавиатуры, можно пользоваться функцией::GetAsyncKeyState.
Символьные сообщения Часто в программах не требуется обрабатывать сообщения о нажатии/отпускании клавиш, но необходимо получать с клавиатуры символы в соответствии с состоянием клавиш Caps Lock, Shift и текущей раскладкой клавиатуры. В данном случае программа может обрабатывать сообщения WM_CHAR. Они генерируются Windows в результате обработки сообщений WM_KEYDOWN/WM_KEYUP системной функцией::TranslateMessage. Эта функция вызывается во внутреннем цикле обработки сообщений MFC. Для обработки сообщения WM_CHAR надо занести в карту сообщений макрос ON_WM_CHAR и добавить в класс функцию-член OnCharсо следующим прототипом:
Назначение параметров nRepCnt и nFlags то же, что и у сообщений WM_KEYDONW/WM_KEYUP. Ниже приведен фрагмент исходного текста, обрабатывающий английские буквенные клавиши, клавишу Enter и Backspace:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-08-01; просмотров: 331; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.170.253 (0.006 с.) |