Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО_экзамен.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
500.22 Кб
Скачать

11. Обработка сообщений мыши

Оконная процедура получает сообщения мыши и когда мышь проходит через окно и при щелчке внутри окна, даже если окно неактивно или не имеет фокуса ввода. В Windows для мыши определен набор из 21 сообщения.

  • WM_MOUSEMOVE – перемещение мыши по рабочей области окна

Если кнопка мыши нажимается или отпускается внутри рабочей области окна, оконная процедура получает следующие сообщения:

  • Левая WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK

  • Средняя WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK

  • Правая WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK

Оконная процедура получает сообщения "DBLCLK" (двойной щелчок) только в том случае, если класс окна был определен так, чтобы их можно было получать.

Для всех этих сообщений значение параметра lParam содержит положение мыши. Младшее слово — это координата х, а старшее слово — координата y относительно верхнего левого угла рабочей области окна.

12. Таймер. Программирование таймера

Установка таймера

Вы можете использовать таймер одним из трех способов, в зависимости от параметров функции SetTimer.

Первый способ

SetTimer(hWndT, 1, 500, NULL);

Когда оконная процедура получает сообщение WM_TIMER, значение wParam равно значению идентификатора таймера (который равен 1 в приведенном примере), а lParam равно 0.

Второй способ

С помощью второго способа вы можете заставить Windows пересылать сообщение таймера другой функции из вашей программы.

Функция, которая будет получать эти таймерные сообщения, называется функцией "обратного вызова" (call-back). Это функция вашей программы, которую вызывает Windows. Вы сообщаете Windows адрес этой функции, а позже Windows вызывает ее.

Третий способ

Такой метод установки таймера используется редко. Он удобен, если в программе в разное время делается много вызовов функции SetTimer, и при этом не запоминаются те таймерные идентификаторы, которые уже использовались.

Третий способ установки таймера напоминает второй, за исключением того, что параметр hwnd функции SetTimer устанавливается в NULL, а второй параметр (обычно идентификатор таймера) игнорируется. Функция возвращает ID таймера.

Удаление таймера

Снятие таймера осуществляется с помощью функции KillTimer().

BOOL KillTimer(HWND hWnd, UINT uIDEvent);

KillTimer(hwnd,TIMER2);

Графическая подсистема Windows

1. Графические устройства и их контекст

Все графические устройства отображения делятся на две больших группы: растровые устройства и векторные устройства. Большинство устройств, подключаемых к PC — растровые устройства, т. е. они представляют графические образы как шаблон точек. Эта группа включает видеоадаптеры, матричные принтеры и лазерные принтеры. Группа векторных устройств, отображающих графические образы с использованием линий, в основном, состоит из плоттеров.

Контекст устройства содержит много текущих атрибутов, определяющих поведение функций GDI при работе с устройством.

Наиболее общий метод получения контекста устройства и его освобождения состоит в использовании функций BeginPaint и EndPaint при обработке сообщения WM_PAINT:

hdc = BeginPaint (hwnd, &ps);

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

EndPaint (hwnd, &ps);

Переменная ps — это структура типа PAINTSTRUCT. Поле hdc этой структуры — это описатель контекста устройства, который возвращается функцией BeginPaint.

Программы для Windows могут также получать описатель контекста устройства в теле обработчика сообщения, отличного от WM_PAINT:

hdc = GetDC (hwnd);

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

ReleaseDC (hwnd, hdc);

Основная разница между использованием этих функций и комбинации функций BeginPaint и EndPaint состоит в том, что вы можете рисовать в пределах всей рабочей области окна, используя описатель контекста устройства, возвращенный функцией GetDC. Кроме того, функции GetDC и ReleaseDC не делают действительным (не требующим перерисовки) ни один недействительный регион клиентской области окна.

Программы для Windows могут также получать описатель контекста устройства, относящийся ко всему окну программы, а не только к его клиентской области:

hdc = GetWindowDC (hwnd);

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

ReleaseDC (hwnd. hdc);