- •МIНIСТЕРСТВО ОСВIТИ І НАУКИ УКРАЇНИ
- •КОНСПЕКТ ЛЕКЦІЙ
- •з дисципліни
- •ХАРКIВ 2014
- •Лекция №1: Введение
- •Первая программа
- •Лекция №2: Скелет оконной программы
- •Вступление
- •Лекция №3: Контекст устройства
- •Понятие контекста устройства
- •Объекты и атрибуты контекста устройства
- •Лекция 4: Мышь и таймер
- •Сообщения мыши
- •Захват мыши
- •Таймер
- •Программная реализация
- •Лекция 5: Клавиатура
- •Лекция 6: Дочерние окна
- •Класс кнопок
- •Флажки
- •Переключатели
- •Класс статических дочерних окон
- •Класс полос прокрутки
- •Класс редактирования
- •Класс окна списка
- •Лекция №7: Ресурсы
- •Способы хранения данных программы
- •Общие сведения о файле ресурсов
- •Создание иконок
- •Лекция №8: Ресурсы (меню)
- •Меню
- •MENUITEM SEPARATOR
- •Лекция №9: Ресурсы (быстрые клавиши)
- •Лекция №10: Многозадачность и многопоточность
- •Многопоточность
- •Программная реализация многозадачности
- •Критические разделы
- •Использование событий
- •К вопросу о переменных
- •Инициализация программы
- •Лекция №12: Динамически подключаемые библиотеки
- •Типы связывания
- •Лекция №13: Представление графической информации
- •Метафайлы
- •Лекция № 14: Обзор платформы .NET
- •Обзор платформы .NET
- •Общая схема архитектуры .NET
- •Основные черты MSIL
- •Понятие сборки
- •Манифест: описание сборки
- •Модели безопасности в .NET
- •Електронне навчальне видання
- •КОНСПЕКТ ЛЕКЦІЙ
- •Упорядник ВОЛК Максим Олександрович
Начало координат кисти |
(0,0) |
SetBrushOrgEx |
GetBrushOrgEx |
(Brush origin) |
|
|
|
Область отсечения |
Not |
SelectObject |
GetClipBox |
(Clipping region) |
|
SelectClipRgn |
|
Лекция 4: Мышь и таймер
Общие сведения
Мышь – это графическое устройство ввода информации с одной или более кнопками. Windows поддерживает однокнопочную, двухкнопочную или трехкнопочную мышь. Фактически стандартом, используемым большинством приложений Windows, стала двухкнопочная мышь. Программа может определить наличие мыши и количество кнопок мыши с помощью системных установок:
bool fMouse = GetSystemMetrics(SM_MOUSEPRESENT); int cButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
Если мышь установлена, fMouse будет установлена в TRUE, количество кнопок при этом будет равняться cButtons.
Когда пользователь перемещает мышь, операционная система перемещает по экрану растровую картинку (обычно стрелку), которая называется "курсор мыши" (mouse cursor). Курсор мыши имеет "вершину" картинки (hot spot), размером в один пиксель, определяющую положение мыши на экране.
Ранее, при регистрации класса окна, мы уже сталкивались с необходимостью выбора типа курсора мыши, который устанавливается в приложении по умолчанию (см. тему "Регистрация окна"):
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
Тип IDC_ARROW является наиболее часто используемым курсором, представляющим собой стрелку, и имеющим вершину в левой верхней части. Приведем несколько примеров предопределенного курсора мыши:
IDC_APPSTARTING |
Стандартная стрелка с песочными часами |
IDC_ARROW |
Стандартная стрелка |
IDC_CROSS |
Крест |
IDC_IBEAM |
Текстовый курсор (в виде символа I) |
IDC_ICON |
Пустая иконка для Windows NT |
IDC_NO |
Перечеркнутая окружность |
IDC_SIZE |
Четыренаправленная стрелка для Windows NT |
IDC_WAIT |
Песочные часы ожидания |
|
24 |
Сообщения мыши
В отличие от клавиатуры, сообщения от мыши приходят в окно в любом случае, если мышь находится над окном (даже, если окно не активно и не имеет фокуса ввода) и совершается какое-либо действие с мышью (перемещение мыши или нажатие клавиш). В таблице 3.4 приведены основные сообщения от мыши, которые могут быть обработаны оконной процедурой:
Таблица3.4 – Основные сообщения от мыши
Сообщение |
|
Назначение |
|
|
WM_MOUSEMOVE |
Мышка перемещается над окном |
|
||
WM_LBUTTONDOWN |
Левая клавиша нажата |
|
||
WM_MBUTTONDOWN |
Средняя клавиша нажата |
|
||
WM_RBUTTONDOWN |
Правая клавиша нажата |
|
||
WM_LBUTTONUP |
Левая клавиша отпущена |
|
||
WM_MBUTTONUP |
Средняя клавиша отпущена |
|
||
WM_RBUTTONUP |
Правая клавиша отпущена |
|
||
WM_LBUTTONDBLCLK |
Левая клавиша дважды нажата |
|
||
WM_MBUTTONDBLCLK |
Средняя клавиша дважды нажата |
|
||
WM_RBUTTONDBLCLK |
Правая клавиша дважды нажата |
|
||
Таблица 3.5 – Значение параметров wParam и lParam для мыши |
|
|||
Значение параметра wParam |
|
Значение параметра lParam |
|
|
Битовая маска, определяющая |
Координаты мыши в координатах |
|
||
состояние управляющих клавиш и |
клиентской области окна: |
|
||
других кнопок мыши: |
|
x=LOWORD(lParam) |
|
|
MK_LBUTTОN левая кнопка нажата |
y=HIWORD(lParam) |
|
||
MK_RBUTTОN правая кнопка нажата |
|
|
||
MK_МBUTTUN средняя кнопка |
|
|
||
нажата |
|
|
|
|
MK_SHIFT |
<Shift> нажат |
|
|
|
MK_CONTROL |
<Ctrl> нажат |
|
|
|
Следует заметить, что окно состоит из двух частей – клиентской области (куда непосредственно осуществляется графический вывод оконной процедуры) и не клиентской области, которую занимает все оставшееся пространство окна (рамка, строка заголовка, меню). Сообщение от мыши приходит в оконную процедуру при попадании в любую область окна – клиентскую и не клиентскую. Тип сообщений в обоих случаях разный. Каждому сообщению в таблице, приведенной выше, соответствует сообщение не клиентской области имеющее префикс NC (nonclient). Например,
WM_NCLBUTTONDOWN, WM_NCLBUTTONUP. Значения остальных параметров для не клиентской области отличаются: wParam показывает зону
25
нерабочей области, в которой произошло перемещение или щелчок мыши (что можно определить при помощи идентификаторов, начинающихся с HT(hit-test) и определенных в заголовочных файлах Windows); параметр lParam содержит координаты мыши относительно экрана.
Существуют две функции, позволяющие перевести оконные координаты в координаты экрана и наоборот:
ScreenToClient(hwnd, pPoint); // преобразует экранные координаты в оконные
ClientToScreen(hwnd, pPoint); // преобразует оконные координаты в экранные
В функции передаются координаты через структуру POINT. Функции преобразуют координаты и записывают новые их значения на место старых.
Захват мыши
Если пользователь щелкнет левой кнопкой мыши в рабочей области окна (которая включает в себя клиентскую и не клиентскую области), Windows сделает активным окно, в котором вы произвели щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN. Обычно, сообщения
WM_LBUTTONDOWN и WM_LBUTTONUP приходят парой, однако возможны исключения. Например, это может случиться, если кнопка мыши нажимается в одном окне, мышь перемещается в ваше окно, и кнопка отпускается. в этом случае, первое окно получит только сообщение
WM_LBUTTONDOWN, а ваше окно получит сообщение WM_LBUTTONUP.
В некоторых случаях программе может потребоваться получать сообщения мыши и в том случае, когда курсор мыши находится вне окна. Например, в графических редакторах, когда фигура (линия, прямоугольник и т.п.) начинает рисоваться по нажатию мыши, а заканчивает рисоваться – по отпусканию кнопки мыши. В этом случае, сообщение об отпускании мыши должно прийти в то же окно, несмотря на то, что мышь перемещена за его пределы. Это возможно при использовании механизма захвата мыши.
Для захвата мыши используется функция:
SetCapture(hWnd);
После вызова этой функции, Windows посылает все сообщения мыши в оконную процедуру того окна, описателем которого является hWnd. Сообщения мыши в этом случае всегда будут оставаться сообщениями рабочей области, даже, если мышь перемещается в нерабочей области окна. Координаты мыши все равно передаются в оконных координатах, в связи с чем они могут принимать отрицательное значение (если мышь окажется выше или
26
левее рабочей области окна). Для освобождения мыши программа обязательно должна вызвать функцию:
ReleaseCapture();
Эта функция возвращает обработку мыши в нормальный режим.
Таймер
Таймер в Windows является устройством ввода информации, которое периодически извещает о том, что истек заданный интервал времени. Ваша программа задает Windows интервал, через который приходят эти извещения.
Таймер используется в Windows в нескольких целях:
-многозадачность – программа может использовать таймер для параллельного вызова подзадач;
-поддержка обновления информации о состоянии программы и ее частей;
-hеализация авто сохранения;
-завершение демонстрационный версий программ;
-задания темпа изменения информации на экране;
-программы мультимедиа и.т.п.
Аппаратно-программные сведения
Системная плата компьютера имеет микросхему таймера. ROM BIOS компьютера инициализирует эту микросхему так, чтобы она генерировала аппаратное прерывание. Это прерывание называют "тиком таймера". Они генерируются каждые 54,925 миллисекунды или примерно 18,2 раза в секунду. Таким образом, устанавливается правило: в обычной ситуации программа не может получать сообщения от таймера чаще, чем 18,2 раз в секунду. Далее вы научитесь устанавливать время срабатывания таймера для вашей программы. Так вот, исходя из ограничения на частоту, можно отметить, что ваша программа физически не может получать сообщения от таймера через интервал, меньший 55 миллисекунд.
Windows получает от таймера аппаратное прерывание (каждые 18,2 секунды). Все программы, использующие таймер, не могут использовать аппаратное прерывание (за исключением программ, работающих под DOS и перехватывающих прерывания). Программы могут использовать таймер двумя способами: периодически получая сообщения от таймера WM_TIMER (фактически – от Windows) либо установив вызов какой либо процедуры приложения в зависимости от таймера. В первом случае, по истечению заданного интервала времени, Windows ставит в очередь сообщений к приложению синхронное сообщение WM_PAINT (это приводит к тому, что программа может получить сообщение несколько позже срока, а если, очередь сообщений переполнена, то и гораздо позже). Во втором случае, вы сообщаете
27
