
- •Оглавление
- •1 Простейшее Win32 приложение
- •2 Функция WinMain
- •3 Оконный класс
- •4 Стили класса, стили окна
- •5 Создание экземпляра оконного класса
- •6 Динамические изменения свойств оконного класса
- •7 Обработка сообщений
- •8 Программирование клавиатуры
- •9 Коды oem, ansii, asci, виртуальные коды клавиш
- •10 Символьные сообщения
- •11 Обработка сообщений от мыши
- •12 Программирование таймера
- •13 Диалоговые окна
- •14 Структура шаблона диалога
- •14(А) Ресурсы диалога
- •15 Функции создания диалога
- •16 Взаимодействие между элементами управления
- •17 Сообщения, SendMessage, SendDlgItemMessage
- •18 Обработка сообщений от элементов диалога
- •19 Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 api, c.148)
- •20 Элемент ProgressBar (Румянцев - Азбука программирования в Win32 api, c.156)
- •21 Bios (общие сведения)
- •22 Файлы (общие сведения)
- •23 Создание файла (Win32 api)
- •24 Операции с файлом (Win32 api)
- •25 Организация файлов
- •26 Файловые системы (общие сведения)
- •Создание файла.
- •Удаление файла.
- •28 Структура логического диска под fat12 (wfat)
- •29 Каталоги в fat12
- •30 Алгоритм определения расположения файлов на диске
- •31 Ф.С. Fat32 (отличительные особенности)
- •32 Изменение элементов системных объектов при выполнении copy
- •33 Ntfs (общие сведения)
- •34 Запись файла в mft
- •35 Метафайлы
- •36 Атрибуты записи файла
- •37 Изменение системных данных при выполнении copy
- •38 Изменение системных данных при выполнении del
- •39 Изменение системных данных при выполнении move
- •40 Процессы. Потоки. Общие сведения
- •41 Модель процесса
- •42 Контекст процесса
- •43 Дескриптор процесса
- •44 Создание процесса (общие сведения)
- •45 Окончание процесса (общие сведения)
- •46 Состояния процесса
- •47 Уровни планирования процессов
- •48 Диспетчеризация процессов
- •49 Класс приоритета процесса
- •50 Создание процесса (Win32 api)
- •51 Win32 Api. Управление процессами
- •52 Win32 Api. Окончание процесса
- •53 Среда процесса
- •54 Командная строка процесса
- •55 Наследование дочерними процессами ресурсов родителя
- •56 Список процессов
- •57 Время выполнения процесса
10 Символьные сообщения
Идея самостоятельного преобразования аппаратных сообщений клавиатуры в символьные сообщения путем учета информации о положении клавиш сдвига является достаточно непродуктивной в силу того, информации о положении этих клавиш недостаточно – необходимо знать об особенностях реализации каждой отдельной национальной клавиатуры.
За программиста это делает 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_DEADCHAR, системные – WM_SYSCHAR, WM_SYSDEADCHAR.
Сообщения WM_SYSCHAR и WM_SYSDEADCHAR являются следствием сообщений 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), поскольку эти клавиши сами по себе не определяют символов.
11 Обработка сообщений от мыши
Мышь- это графическое устройство ввода информации с одной или более кнопками.
Сообщения мыши связанные с рабочей областью окна.
Оконная процедура получает сообщение мыши и когда мышь проходит через окно и при щелчке внутри окна, даже если окно неактивно или не имеет фокус ввода. В Windows для мыши определен набор из 21 сообщения. Однако, 11 из этих сообщений не относятся к рабочей области, и программы для Windows обычно игнорируют их.
Если мышь перемещается по рабочей области окна, оконная процедура получает сообщение WM_MOUSEMOVE.
Если кнопка мыши нажимается или отпускается внутри рабочей области окна, оконная процедура получает следующие сообщения:
Кнопка Нажатие Отпускание Нажатие(Второй щелчок)
Левая WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK
Средняя WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK
Правая WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK
Для всех этих сообщений значение параметра lParam содержит положение мыши. Младшее слово — это координата х, а старшее слово — координата y относительно верхнего левого угла рабочей области окна. Можно извлечь координаты х и y из параметра lParam с помощью макросов LOWORD и HIWORD, определенных
в заголовочных файлах Windows. Значение параметра wParam показывает состояние кнопок мыши и клавиш <Shift> и <Ctrl>. Можно проверить параметр wParam с помощью битовых масок, определенных в заголовочных файлах. Префикс MK означает "клавиша мыши" (mouse key).
MK_LBUTTON Левая кнопка нажата
MK_MBUTTON Средняя кнопка нажата
MK_RBUTTON Правая кнопка нажата
MK_SHIFT Клавиша <Shift> нажата
MK_CONTROL Клавиша <Ctrl> нажата
При движении мыши по рабочей области окна, Windows не вырабатывает сообщение WM_MOUSEMOVE для всех возможных положений мыши. Количество сообщений WM_MOUSEMOVE, которые получает программа, зависит от устройства мыши и от скорости, с которой оконная процедура может обрабатывать сообщения о движении мыши.
При щелчке левой кнопкой мыши в рабочей области неактивного окна, Windows сделает активным окно, в котором произвели щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN. Если оконная процедура получает сообщение WM_LBUTTONDOWN, то программа может уверенно считать, что ее окно активно.
Есть два исключения:
• Оконная процедура может "захватить мышь" (capture the mouse) и продолжать получать сообщения мыши, даже если она находится вне рабочей области окна.
• Если системное модальное окно сообщений или системное модальное окно диалога находится на экране, никакая другая программа не может получать сообщения мыши. Системные модальные окна сообщений и диалога запрещают переключение на другое окно программы, пока оно активно.
Сообщения мыши нерабочей области.
Если мышь оказывается вне рабочей области окна, но все еще внутри окна, Windows посылает оконной процедуре сообщения мыши "нерабочей области". Нерабочая область включает в себя панель заголовка, меню и полосы прокрутки окна.
Нет необходимости обрабатывать сообщения мыши нерабочей области. Вместо этого их просто передают в DefWindowProc, чтобы Windows могла выполнить системные функции.
Сообщения мыши нерабочей области почти полностью такие же как и сообщения мыши рабочей области. В названия сообщений входят буквы "NC", что означает "нерабочая" (nonclient). Если мышь перемещается внутри нерабочей области окна, то оконная процедура получает сообщение WM_NCMOUSEMOVE. Кнопки мыши вырабатывают
следующие сообщения:
Кнопка Нажатие Отпускание Нажатие (Второй щелчок)
Левая WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCLBUTTONDBLCLK
Средняя WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMBUTTONDBLCLK
Правая WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_NCRBUTTONDBLCLK
Параметр wParam показывает зону нерабочей области, в которой произошло перемещение или щелчок мыши. Его значение приравнивается одному из идентификаторов, начинающихся с HT, что означает "тест попадания" (hit-test), которые определяются в заголовочных файлах Windows.
Переменная lParam содержит в младшем слове значение координаты х, а в старшем — y. Однако, эти координаты являются координатами экрана, а не координатами рабочей области, как это было у сообщений мыши рабочей области. Значения координат x и y верхнего левого угла экрана равны 0. Если вы движетесь вправо, то увеличивается значение координаты х, если вниз, то значение координаты у.