Вот и наступил исторический момент прощания c легендарным чёрным окном. Мавр
сделал своё дело, мавр может уходить... Жаль, так уходит история, хотя с другой
стороны пора развиваться дальше!!!
Старая и новая концепция программирования:
Все программы, которые были написаны вами до этого момента, имели структуру
программ под DOS (хотя и назывались они консольными приложениями под Windows).
Они использовали традиционный, процедурный подход к программированию. Что это
значит? Программа выполнялась последовательно от начала (от первой строки
функции main) до конца в предопределенном порядке. Наиболее часто выполняемые
блоки программ выделялись в подпрограммы. Налицо последовательное выполнение
программы. Продолжим дальше. Во многих операционных системах взаимодействие
между системой и программой инициализирует программа. Например, в DOS программа
запрашивает разрешение на ввод и вывод данных. Говоря другими словами, не-
Windows-программы (программы, написанные без использования архитектуры
Windows-приложения) сами вызывают операционную систему. Операционная система не
вызывает прикладную программу. В Windows-приложениях все совершенно наоборот:
именно система вызывает программу. Этот процесс осуществляется следующим
образом: программа ждет, пока не получит сообщение от Windows.
Сообщение - это сигнал от системы о том, что произошло какое-то
событие.
Любое событие, происходящее в системе, будь то создание окна или перемещение
мыши, сопровождается соответствующим сообщением, которое посылается либо
конкретному окну, либо некоторым, либо всем окнам. Иногда одно событие влечет за
собой еще несколько событий и сообщений. Например, событие создание окна влечет
за собой событие перерисовки окна, акивизации окна, а так же событие создания
окна для дочерних окон (кнопок, полей ввода) и так далее. Сообщение передается
программе через специальную функцию, вызываемую Windows. После того как
сообщение получено, программа ищет функцию-обработчик данного сообщения, если он
определен в коде программы, то выполняется его тело, иначе вызывается
стандартный Windows-обработчик (стандартная функция обработки события для этого
сообщения). После завершения обработки сообщения программа ожидает следующего.
Windows может посылать программе сообщения различных типов. Например, каждый раз
при щелчке мышью в окне активной программы посылается соответствующее сообщение.
Другой тип сообщений посылается, когда необходимо обновить содержимое активного
окна. Сообщения посылаются также при нажатии клавиши, если программа ожидает
ввода с клавиатуры. Необходимо запомнить одно: по отношению к программе
сообщения появляются случайным образом. Вот почему Windows-программы похожи на
программы обработки прерываний: невозможно предсказать, какое сообщение может
появиться в следующий момент. Естественно всё это вносит коррективы в
традиционный, процедурный подход к программированию. Типичная Windows-программа
выполняется нелинейно. Невозможно предсказать, какой фрагмент кода будет
выполняться через минуту. Это связано с тем, что сообщения приходят в программу
абсолютно произвольно. Сообщение характеризуется номером и двумя числовыми
параметрами. Номер сообщения должен быть уникальным, по крайней мере, в пределах
одного приложения. Чаще всего пользуются мнемоническим обозначением сообщения (
например, WM_CREATE вместо 0x1 ). Список сообщений находится в файле winuser.h.
Например, типичная строка из этого файла:
#define WM_PAINT 0x000F
Параметры сообщения носят название wParam и lParam. Значения и смысл этих
параметров зависят от конкретного сообщения.
Примеры сообщений :
События мыши:
С мышью связан целый ряд событий и это вполне естественно, так как мышь
является незаменимым механизмом для работы в Windows.
WM_LBUTTONDOWN
Сообщение приходит, когда пользователь нажимает левую кнопку
мышки
Прототип обработчика этого сообщения:
afx_msg void OnLButtonDown( UINT nFlags, CPoint point );
Параметр nflags - показывает, какие кнопки были нажаты,
когда произошло событие.
Префикс afx_msg показывает, что данная функция является обработчиком
какого-то события.
Этот параметр может быть комбинацией следующих значений:
MK_CONTROL - была нажата кнопка CTRL.
MK_LBUTTON - была нажата левая кнопка мышки.
MK_MBUTTON - была нажата средняя кнопка мышки.
MK_RBUTTON - была нажата правая кнопка мышки.
MK_SHIFT - была нажата кнопка SHIFT.
Параметр point - содержит координату x и y позиции точки,
где находился указатель мыши в тот момент, когда произошло событие.
Эти координаты считаются относительно левого
верхнего угла окна.
WM_RBUTTONDOWN
Сообщение приходит, когда пользователь нажимает правую кнопку
мышки
Прототип обработчика этого сообщения:
afx_msg void OnRButtonDown( UINT nFlags, CPoint point );
Всё, что было сказано о предыдущем сообщении, верно и для этого.
WM_LBUTTONDBLCLK
Сообщение приходит, когда пользователь совершает двойной щелчок левой кнопки
мышки.
Прототип обработчика этого сообщения:
afx_msg void OnLButtonDblClk( UINT nFlags, CPoint point );
Всё, что было сказано о предыдущем сообщении, верно и для этого.
WM_RBUTTONDBLCLK
Сообщение приходит, когда пользователь совершает двойной щелчок правой
кнопки мышки.
Прототип обработчика этого сообщения:
afx_msg void OnRButtonDblClk( UINT nFlags, CPoint point );
Всё, что было сказано о предыдущем сообщении, верно и для этого.
WM_MOUSEMOVE
Сообщение приходит, когда пользователь передвигает
мышку.
Прототип обработчика этого сообщения:
afx_msg void OnMouseMove( UINT nFlags, CPoint point );
Всё, что было сказано о предыдущем сообщении, верно и для этого.
Событие диалога :
WM_INITDIALOG
Сообщение приходит приложению (в частности, классу, производному от класса
CDialog) перед тем, как диалог показывается на экран.
Прототип обработчика этого сообщения:
virtual BOOL OnInitDialog( );
Этот обработчик вызывается перед показом на экран диалога.
В нем можно проводить подготовительные мероприятия
(например, инициализацию переменных диалога, настройку необходимых
параметров, вызов функций, которые должны выполняться сразу
после отображения окна диалога на экране и т. п.).