Программирование устройств в Windows: Методические указания к выполнению практических и лабораторных работ по курсу “Операционные системы, среды и оболочки”, страница 9

Чтобы увидеть, как именно происходит этот процесс, можно модифицировать функцию KeyMouse_OnMouseMove, чтобы выводимый текст изменял цвет в зависимости от того, какие клавиши нажимаются. Модифицированная функция KeyMouse_OnMouseMove способна реально продемонстрировать всю мощь, присущую системе сообщений Windows. Строчка, ассоциированная с WM_MOUSEMOVE, плавно изменяет цвета при нажатии клавиш Control и Shift. В процессе модификации функции KeyMouse_OnMouseMove я ввел вызовы SetTextColor и RGB. Эти два вызова постоянно используются в Windows-программах.

Макрос RGB возвращает 4-байтное значение, определяющее цвет. Возвращаемый цвет определяется тремя параметрами, передаваемыми в макрос, каждый из которых может принимать значение от 0 до 255.

Если третий параметр устанавливается равным 255, а остальные нулю, результирующий цвет будет темно-синим. Если первый параметр равен 255, а остальные нулю, то цвет будет красным. Средний параметр управляет интенсивностью зеленого в цвете, возвращаемом макросом RGB.

Функция SetTextColor легче для понимания, нежели макрос RGB, поскольку  он устанавливает цвет текста, который выводится в передаваемый ей контекст устройства. Иначе говоря, она "копирует" результат функции RGB в контекст устройства.

Рассмотрим,  как происходит нажатие кнопок мыши. Программа KeyMouse использует функции KeyMouse_OnLButtonDown и КеуMouse_OnLButtoftUp для записи случаев нажатия кнопки. Работа этих функций очень похожа на работу всех остальных программ. Легче понять, что происходит, когда кнопку отпускают, нежели когда ее нажимают. Поэтому начнем с функции KeyMouse_OnLButtonUp. Обработка нажатий кнопок немного сложнее, поскольку необходимо отличать одинарные щелчки от двойных. К счастью, для этого в Windows предусмотрена относительно простая система.

Если необходимо обрабатывать двойные щелчки левой или правой кнопками мыши, то надо начать с установки стиля окна в CS_DBLCLKS. Это делается в методе Register.

Сообщение, посылаемое при двойном щелчке левой кнопкой мыши, называется WM_LBUTTONDBLCLK, но соответствующий взломщик сообщения из WINDOWSX направляет эту информацию в ту же функцию, которая обрабатывает сообщения WM LBUTTONDOWN.

Завладев контекстом устройства, функция проверяет, был ли сделан двойной щелчок или одинарный. В первом случае параметр fDoubleClick будет равен TRUE. При этом функция печатает строку, сигнализирующую, что было послано сообщение WM_LBUT TONDBLCLK. Кроме того, функция информирует пользователя о текущем состоянии координат и об установках флажков. Разумеется, если двойного щелчка не было, пользователь извещается о сообщения WM_LBUTTONDOWN. Тогда функция отображает текущее состояние всех параметров, включая координаты мыши в момент нажатия левой кнопки. Windows гарантирует, что программе посылается достаточно информации об ее окружении. Программист должен научить программу отвечать на эти сообщения.


4 ПРОЦЕСС  СОЗДАНИЯ  И ВЫПОЛНЕНИЯ  ПРОГРАММ

Для работы с программой в среде DELPHI необходимо:

1)  Вызвать DELPHI;

2)  В главном меню выбрать опцию FILE;

3)  В подменю выбрать опцию New Application;

4)  В главном меню выбрать опцию Viev;

5)  В подменю выбрать опцию Project Manager;

6)  Закрыть все, не сохраняя ничего;

7)  В главном меню выбрать опцию Viev;

8)  В подменю выбрать опцию Project Source;

9)  Отредактировать появившуюся в окне программу;

10)  Имя программы и имя проекта должны совпадать.

4.1  Программа, использующая Windows API для создания окна

program Window1;

{ Базовый код, для расширения меняется только оконная функция}

uses

Windows, Messages;

const

AppName = 'First';

{******                  Оконная функция                                 *******}

function WindowProc(Window: HWnd; AMessage, WParam,

LParam: Longint): Longint; stdcall; export;

{------ Назначение: обработка сообщений, приходящих в окно               -------}

{ В программе обрабатывается только сообщение  завершения работы}

begin

WindowProc := 0;

case AMessage of

wm_Destroy: begin