ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 8

Часть 2. Использование ObjectWindows
Глава 7. Обзор ObjectWindows
Объектная библиотека окон ObjectWindows является мощным набором типов объектов, которые могут существенно ускорить разработку вами программ на Turbo Pascal для Microsoft Windows.
В данной главе содержится обзор иерархии объектов ObjectWindows. Остальные главы этой части руководства содержат подробное описание различных частей иерархии.
Кроме описания иерархии объекта материал данной главы подчеркивает основные принципы программирования в среде Windows, включая использование ресурсов, вызов Windows API и получение и обработку сообщений от Windows.
Соглашения относительно ObjectWindows
Имена всех имеющихся в ObjectWindows объектов начинаются с T. Например, тип TDialog воспроизводит объекты блока диалога. Вместе с определением каждого типа имеется указатель на этот тип, который начинается с P. Например, PDialog это указатель на TDialog.
 Прорабатывая приведенные в данном руководстве примеры, вы создадите некоторые динамические объекты, например, объекты PDialog вместо объектов TDialog.
При задании методов реакции на сообщения используются имена этих сообщений, но без подчеркивания. Например, метод реакции на сообщение wm_KeyDown будет называться WMKeyDown, а метод реакции на команду cm_FileOpen будет называться CMFileOpen.
Иерархия ObjectWindows
ObjectWindows это библиотека, состоящая из иерархии типов объектов, которые вы можете использовать, модифицировать или добавлять, следуя правилам наследования. Глава 5 "Справочного руководства по Windows" служит полным справочником по этим типам и их пол
ям и методам. Данное издание является полным руководством пользователя по типам объектов библиотеки и методам. Оно также содержит примеры программ, показывающие поэтапную разработку программ для Windows с использованием ObjectWindows.
                        ЪДДДДДДДДДДДДДї
                        іTObject      і
                        АДДДДДВДДДДДДДЩ
          ЪДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДї
    ЪДДДДДБДДДДДДї      ЪДДДДДБДДДДДДДї     ЪДДДДБДДДДДДї
    іTApplicationі      іTWindowObjectі     іTScroller  і
    АДДДДДДДДДДДДЩ      АДДДДДВДДДДДДДЩ     АДДДДДДДДДДДЩ
          ЪДДДДДДДДДДДДДДДДДДДґ
    ЪДДДДДБДДДДДДї      ЪДДДДДБДДДДДДї
    іTDialog     і      іTWindow     і
    АДДДДДВДДДДДДЩ      АДДДДДВДДДДДДЩ
          АДДДДДДДї      ЪДДДДБДДДДДДВДДДДДДДДДДДДДДї
    ЪДДДДДДДДДДї  і  ЪДДДБДДДДї ЪДДДДБДДДДДї  ЪДДДДДБДДДДДї
    іTDigWindowГДДґ  іTControlі іTMDIWindowі  іTEditWindowі
    АДДДДДДДДДДЩ  і  АДДДВДДДДЩ АДДДДДДДДДДЩ  АДДДДДВДДДДДЩ
                  і      і                          і
    ЪДДДДДДДДДДДї і      і  ЪДДДДДДДДДДДДї    ЪДДДДДБДДДДДї
    іTFileDialogГДґ      ГДДґTMDIClient  і    іTFileWindowі
    АДДДДДДДДДДДЩ і      і  АДДДДДДДДДДДДЩ    АДДДДДДДДДДДЩ
                  і      і
    ЪДДДДДДДДДДДДїі      і  ЪДДДДДДДДДДДДї
    іTInputDialogГЩ      ГДДґTButton     і
    АДДДДДДДДДДДДЩ       і  АДДДДДДДДДДДДЩ
                         і
                         і  ЪДДДДДДДДДДДДї
                         ГДДґTScrollBar  і
                         і  АДДДДДДДДДДДДЩ
                         і
                         і  ЪДДДДДДДДДДДДї
                         ГДДґTStatic     і
                         і  АДДДДДВДДДДДДЩ
                         і        і
                         і  ЪДДДДДБДДДДДДї
                         і  іTEdit       і
                         і  АДДДДДДДДДДДДЩ
                         і
                         і  ЪДДДДДДДДДДДДї
                         ГДДґTListBox    і
                         і  АДДДДДДДДДДДДЩ
                         і
                         і  ЪДДДДДДДДДДДДї
                         ГДДґTComboBox   і
                         і  АДДДДДДДДДДДДЩ
                         і
                         і  ЪДДДДДДДДДДДДї
                         ГДДґTGroupBox   і
                         і  АДДДДДДДДДДДДЩ
                         і
                         і  ЪДДДДДДДДДДДДї
                         АДДґTCheckBox   і
                            АДДДДДВДДДДДДЩ
                                  і
                            ЪДДДДДБДДДДДДї
                            іTRadioButtonі
                            АДДДДДДДДДДДДЩ
Рис.7.1. Иерархия типов объектов в ObjectWindows
Базовые объекты
TObject является базовым типом объекта, общим предшественником всех типов объектов ObjectWindows. Он определяет рудиментарный конструктор и деструктор. Потоки ObjectWindows требуют, чтобы все сохраняемые в них объекты происходили от TObject.
TAplication
Этот тип определяет поведение, которое требуется от всех приложений ObjectWindows. Каждое приложение ObjectWindows, которое вы напишете, будет определять тип объекта приложения, который происходит от TApplication. Кроме всего прочего, он будет отвечать з
а инициализацию объекта головного окна. Объекты приложения детально описаны в Главе 8, "Объекты приложения".
Объекты интерфейса
Остальные объекты иерархии ObjectWindows можно классифицировать как объекты интерфейса. Они являются объектами интерфейса как в том смысле, что они представляют элементы интерфейса пользователя Windows, так и в том смысле, что они служат определенным вид
ом интерфейса между кодом вашего приложения и средой Windows. Объекты интерфейса подробно описаны в Главе 9, "Объекты интерфейса".
TWindowsObjects
TWindowsObjects это абстрактный тип объекта, который унифицирует три главных типа объектов интерфейса ObjectWindows: окна, блоки диалога и управления. Он предоставляет методы создания, обработки сообщений и ликвидации объектов окна.
Объекты окна
Объекты окна представляют собой не только известные окна среды, но и большинство визуальных элементов этой среды, например, управления.
TWindow
Объекты TWindow это окна общего назначения, которые могут служить головным окном приложения или одним из его всплывающих окон. Объекты TWindow могут отображать и графику, но наиболее часто вы будете специализировать поведение TWindow путем определения пр
оизводных от данного типов.
TEditWindow
Производный от TWindow, TEditWindow определяет окно, которое позволяет редактировать текст.
TFileWindow
Производный от TEditWindow, TFileWindow определяет окно, которое загружает, редактирует и сохраняет текстовые файлы.
Объекты диалога
Объекты диалога служат для обеспечения работы с диалоговыми группами, особенно группами управлений (кнопки, блоки списков и линейки прокрутки). Объекты диалога подробно рассматриваются в Главе 11, "Объекты диалога".
TDialog
Этот абстрактный тип объекта служит шаблоном для производных типов, которые управляют блоками диалога Windows. Объекты диалога связаны с ресурсами диалога и могут запускаться как блоки диалога с заданным режимом, так и без него. Предоставляются методы дл
я обработки коммуникации между диалогом и его управлениями.
TDlgWindow
Этот тип комбинирует ресурсы объектов диалога приложения с адаптируемыми объектами окна.
TFileDialog
TFileDialog это тип диалога, который особенно важен во многих приложениях. Он определяет диалог, который позволяет пользователю выбрать файл для целей его открытия, редактирования или сохранения.
TInputDialog
Этот тип определяет блок диалога для ввода пользователем отдельного элемента текста.
Объекты управления
Управление позволяет пользователю в диалогах и некоторых окнах вводить данные и выбирать опции. Объекты управления дают надежные и простые средства взаимодействия со всеми различными видами управлений, определенными в Windows. Объекты управления подробно
 описаны в Главе 12, "Объекты управления".
TControl
TControl это абстрактный тип объекта, который служит общим предшествующим типом для всего множества управлений Windows, включая блоки списков и кнопки. Он определяет методы создания управлений и обработку сообщений для его последующих типов.
TButton
TButton определяет создание кнопок Windows.
TListBox
Этот класс определяет создание и выбор из блоков списка Windows.
TComboBox
Производный тип от TListBox, TComboBox определяет поведение комбинированных блоков Windows. Комбинированный блок это внутренняя зависимость блока списка и управления редактированием.
TCheckBox
TCheckBox определяет создание и управление блоками проверки Windows.
TRadioButton
TRadioButton определяет создание и управление блоками клавишами Windows.
TGroupBox
TGroupBox управляет созданием блоков групп Windows.
TEdit
TEdit обеспечивает экстенсивные возможности обработки текста для управления редактированием Windows.
TScrollBar
Этот тип обеспечивает создание и управление автономными управлениями линейками прокрутки.
TStatic
TStatic предоставляет методы установки, запроса и очистки текста статического (только вывода) управления.
Объекты MDI
Windows реализует стандарт обработки нескольких документов в пределах одного окна, называемый Интерфейс Нескольких Документов (Multiple Document Interface - MDI). ObjectWindows предоставляет средства установки и управления окнами MDI. Объекты MDI подробн
о описаны в Главе 13, "Объекты MDI".
TMDIWindow
TMDIWindow обеспечивает соответствующее поведение для головного окна приложения, которое следует спецификации MDI Windows.
TMDIClient
TMDIClient обеспечивает дополнительную поддержку окон MDI. Объект клиента MDI это объект, который в действительности управляет областью клиента окна MDI и областью, которая содержит дочерние окна ("документы").
Модули ObjectWindows
ObjectWindows реализует перечисленные выше типы в откомпилированных модулях Turbo Pascal. Данный раздел суммирует содержание этих модулей. Только модуль WObject обязательно требуется в каждом приложении ObjectWindows.
WObjects
WObject должен обязательно использоваться всеми приложениями ObjectWindows. Он определяет все стандартные типы объектов окон, абстрактные типы подобные TObject и другие полезные типы, которые реализуют наборы и потоки.
WinProcs
WinProc определяет заголовки функций и процедур для Программного Интерфейса Приложения (Applications Programming Interface) Windows. Через WinProc можно получить доступ к любой программе, предоставляемой стандартными библиотеками Windows. Вместе с WinTyp
es, WinProc определяет реализацию Turbo Pascal Windows API. Модуль WinProc и его содержание описаны в разделе "Функции Windows" данной главы.
WinTypes
WinTypes определяет версию в Turbo Pascal всех типов, используемых программами Windows API, включая простые типы и структуры данных (записи), и все стандартные константы Windows, включая стили, сообщения и флаги.
StdDlgs
StdDlg определяет два стандартных типа диалога, TFileDialog и TInputDialog.
StdWnds
StdWinds определяет два стандартных типа окна, TDlgWindow и TFileWindow.
Ресурсы Windows
ObjectWindows содержит два файла ресурсов: STDDLGS.RES, который содержит необходимые для объектов TFileDialog и TInputDialog ресурсы, и STDWNDS.RES, который содержит необходимые для объектов TFileWindow и TEditWindow ресурсы. Ресурсы автоматически включа
ются при использовании соответствующего модуля, поэтому любая программа, которая использует модуль StdDlgs, будет автоматически иметь доступ к ресурсам STDDLGS.RES .
Функции Windows
Функционирование Windows основывается на использовании порядка 600 функций. Каждая из этих функций имеет имя, например LoadMenu и MessageBox. Единственная возможность для приложения Windows манипулировать средой, изменять ее внешний вид или реагировать в
 ответ на действия пользователя, состоит в вызове одной или нескольких функций Windows. Однако, если использовать ObjectWindows, то можно создавать окна, отображать блоки диалога и манипулировать управлениями без вызова какой-либо функции Windows. Как же
 это работает ?
Вызовы функций Windows из ObjectWindows
Методы ObjectWindows вызывают функции Windows. Но ObjectWindows это не дублирование функционирования, а переупаковка функций Windows, его программного интерфейса приложения (API) в динамическую, объектно-ориентированную библиотеку. Кроме того, ObjectWind
ows значительно упрощает задачу указания множества параметров, которые требуются для функций Windows. ObjectWindows часто автоматически задает параметры (такие например, как регуляторы окна и ID для дочерних окон), которые хранятся как поля в объектах ин
терфейса.
Например, многие функции Windows требуют регулятор окна, для определения именно того окна, в котором они будут действовать. Эти функции обычно вызываются из методов объекта окна. Объект держит регулятор связанного с ним окна в поле HWindow, поэтому он мо
жет передаваться автоматически, освобождая вас от необходимость задавать его каждый раз. Т.о. типы объектов ObjectWindows объектно ориентированным слоем, реализованным с вызовами не объектно-ориентированного Wnidows API.
Доступ к функциям
Для непосредственного доступа к любой из функций Windows из ваших приложений ObjectWindows, вы должны рассмотреть модуль WinProc. WinProc определяет заголовок процедуры или функции Turbo Pascal для каждой функции Windows, позволяя вам вызывать функции Wi
ndows как некоторые процедуры Turbo Pascal. Список заголовков функций приводится в "Справочном руководстве по Windows", Глава 2, "Справочник по функциям Windows".
Функции Windows требуют передачи им в качестве аргументов множества констант типа Word и Longint. Эти константы представляют окна, блоки диалога, стили управления, возвращаемые значения и т.п. Использующий эти константы код более легко читать, обслуживат
ь и вносить в него изменения в будущих версиях Windows, чем использующий цифровые значения код. Например, насколько более информативно определить окно со стилем ws_Popup, чем $80000000. ws_Popup и другие константы определяются в модуле WinTypes, и подроб
но описаны в "Справочном руководстве по Windows", Глава 1, "Стили и константы Windows".
Некоторые функции требуют более сложных структур данных (например, описывающих шрифты - TLogFont, или классы окон - TWindClass). Windows и ObjectWindows определяют эти и другие структуры данных. Список имеющихся структур содержится в файле WINTYPES.INT и
ли в "Справочном руководстве по Windows", Глава 4, "Справочник по типам Windows".
С использованием ObjectWindows все функции Windows непосредственно доступны и могут быть вызваны из вашего исходного кода, если в операторе программы uses будет присутствовать WinProc. Например, данный код вызывает функцию Windows MessageBox для предоста
вления блока сообщения:
Reply:=MessageBox(HWindow, 'Do you want to save ?', File has
changed', mb_YesNo or mb_IconQuestion);
MessageBox возвращает целое значение, которое указывает действие, предпринятое пользователем для закрытия блока сообщения. Если пользователь нажмет кнопку Yes, то результатом будет определенная Windows целая константа id_Yes. Если пользователь нажмет кно
пку No, то будет результат id_No.
Константы комбинирования стиля
Функции Windows, которые производят элементы интерфейса обычно требуют несколько параметров стиля типа Word или Longint. Windows определяет сотни констант стиля, которые все приводятся в "Справочном руководстве по Windows", Глава 1, "Стили и константы Wi
ndows". Идентификаторы констант стиля из мнемонического префикса из двух букв за которым после знака подчеркивания следует описательное имя. Например, ws_Popup это константа стиля окна (ws_ означает "стиль окна" - window style) для всплывающих окон.
Для воспроизводства нового стиля эти константы часто должны быть скомбинированы. В примере MessageBox вы послали mb_Yes или IconQuestion в качестве параметра стиля. Этот стиль воспроизведет блок сообщения с двумя кнопками, Yes и No, и пиктограммой знака 
вопроса. Слово or, которое стоит между операторами в действительности побитно комбинирует две константы. Результирующий стиль будет не одним из названных, а их комбинацией.
Следует помнить о том, что некоторые стили взаимно исключают друг друга. Их комбинирование приведет к непредсказуемым и возможно к нежелательным результатам.
Типы функций Windows
Далее приводятся различные функции Windows, доступные для ваших программ ObjectWindows.
Функция интерфейса менеджера окна
Эти функции обрабатывают сообщения, манипулируют окнами и блоками диалога и организуют вывод системы. Эта категория включает функции меню, курсоров и буферов вырезанного изображения.
Функции интерфейса графического устройства (GDI)
Эти функции выводят текст, графику и побитовые расположения на множество устройств, включая экран и принтер. Функции не привязаны к какому-либо конкретному устройству, а являются аппаратно-независимыми.
Функции интерфейса системного сервиса
Эти функции отвечают за широкий диапазон сервиса системы, включая управление памятью, взаимодействие с операционной системой, управление ресурсами и коммуникацией.
Функции обратного вызова
Windows имеет функции перечисления, которые позволяют вам организовывать циклы или организовывать перечислимые типы определенных элементов в системе Windows. Например, вы можете перечислить шрифты системы и распечатать пример текста каждым из них. Для ис
пользования этих функций вы должны передать указатель на функцию (функцию обратного вызова) для Windows для вызова в процессе перечисления. Указанная функция будет вызываться непосредственно Windows по мере перечисления ее списка объектов окна, окон, доч
ерних окон, шрифтов и т.п. Функции Windows, которые требуют функций обратного вызова:EnumChildWindows, EnumClipboardFormats, EnumFonts, EnumMetaFile,EnumObjects, EnumProps, EnumTaskWindows и EnumWindows.
Можно передать указатель на виртуальный метод как функцию обратного вызова в этих методах, но в этом случае данный метод будет всегда вызываться независимо от полиморфизма. Другими словами, адрес определяется в процессе компиляции, поэтому конкретным мет
одом всегда будет вызванный. В большинстве случаев следует использовать статический метод или обычную функцию. В этих методах указатель на функцию передается как первый параметр типа TFarProc. Например, если вы определите функцию обратного вызова в Pasca
l, ActOnWindow, следующим образом:
Function ActOnWindow(TheHandle: HWnd; TheValue: Longint): Integer;
то вы сможете передать ее как обратный вызов в вызове функции Windows EnumWindows:
ReturnVal:=EnumWindows(TFarProc(ActOnWindow), ALongint);
Функция обратного вызова должна иметь тот же самый тип возвращаемого значения, что и вызывающая ее функция Windows. Функция ActOnWindow произведет некоторые действия в указанном переданным регулятором окне. Параметр TheValue это произвольное значение, ко
торое выберет для передачи функция, вызывающая EnumWindows.
Прием сообщений Windows
Типичное приложение Windows есть нечто большее, чем диспетчер и обработчик сообщений. Например, когда пользователь, находясь в окне, нажимает кнопку на мыши, Windows посылает сообщение приложению. Аналогично функциям Windows имеется множество различных с
ообщений Windows, подобных wm_LButtonDown и wm_Command (wm_ означает Сообщение Windows - Windows Message). Сообщение Windows подобно вызову функции несет в себе параметры, заполненные важной информацией. Можно сказать о том, что сообщения это способ Wind
ows вызывать функции вашей программы.
Приложение отвечает за распознавание сообщений и направление их к соответствующим частям кода приложения. Например, приложение Windows может определять программу, которая обрабатывает нажатие пользователем кнопки на мыши в окне. ObjectWindows автоматичес
ки диспетчирует сообщения с помощью добавления в Turbo Pascal таблицы виртуально метода (VMT - virtual method table) вызываемой таблицей динамического метода (DMT - dinamic method table). DMT позволяет вам расширить определение метода путем включения в н
его идентификатора, который соответствует сообщению Windows. Все что вам остается сделать, это написать методы реакции на сообщения Windows. Эти методы называются методами реакции.
Приведем заголовок определения метода реакции, который будет вызываться, когда пользователь нажмет левую кнопку на мыши: 
Procedure WMLButtonDown(var Msg: TMessage); virtual wm_First +
 wm_LButtonDown;
Как события становятся вызовами метода
Для того, чтобы успешно программировать в ObjectWindows, нужно научиться писать методы реакции. Однако, для этого нужно понять, какие типы событий приводят к появлению определенного типа сообщений. Сообщения Windows могут поступать из следующих источнико
в:
- Передвигая мышь и нажимая на ней кнопки или нажимая клавиши на   клавиатуре пользователь генерирует сообщения, вызванные   пользователем.
- Ваше программа может посылать сообщения себе самой.
- Ваша программа может вызвать функции Windows, которые могут   привести к поступлению других сообщений Windows.
- Приложения могут посылать сообщения другим приложениям через   динамический обмен данными (DDE - dynamic data exchange).
- Оболочка Windows, включая Менеджер Программ, посылает сообщения   всем открытым приложениям до своего закрытия.
Реакция на сообщения, вызванные действиями пользователя, это главная цель взаимодействия с пользователем. Это называется зависящим от событий программированием. После того, как произойдет событие, модуль Windows USER.EXE генерирует сообщение и посылает е
го в очередь сообщений приложения. Поскольку имеется только одно USER.EXE для сеанса Windows, каждое работающее в данный момент приложение имеет свою собственную очередь сообщений. Каждое приложение отвечает за обслуживание своей очереди сообщений и реаг
ирование на эти сообщения. ObjectWindows заботится об обслуживании очередей своих приложений. Таким образом Windows обеспечивает многозадачный режим работы. Рассмотрим Рис.7.2.
                                           ЪДДДДДДДДДДДДДї
                                         ЪДґПриложение 1 і
     сообщения                           і АДДДДДДДДДДДДДЩ
     мыши              ЪДДДДДДДДДДДДї    і
     ДДДДДДДДДДДДДДДДДДґ            і    і ЪДДДДДДДДДДДДДї
                       і MS-Windows ГДДДДЕДґПриложение 2 і
                       і (USER.EXE) і    і АДДДДДДДДДДДДДЩ
     ДДДДДДДДДДДДДДДДДДґ            і    і
     сообщения         АДДДДДДДДДДДДЩ    і ЪДДДДДДДДДДДДДї
     клавиатуры                          АДґПриложение 3 і
                                           АДДДДДДДДДДДДДЩ
Рис.7.2. Как сообщение попадает в приложение
В теле каждого приложения Windows есть участок кода, называемый циклом сообщения, который задействован в процессе всего функционирования программы. Цикл сообщения разбирает очередь сообщений и распределяет их по соответствующим участкам программы. Цикл с
ообщения приложения ObjectWindows это метод MessageLoop его объекта TApplication.
Каждое сообщение Windows идентифицирует окно, с которым связано вызвавшее его событие, включая регулятор окна в запись сообщения. ObjectWindows направляет это сообщение объекту окна, связанному с этим регулятором окна. ObjectWindows определяет, задан ли 
в окне метод реакции на это конкретное сообщение, и, если это так, вызывает этот метод. В противном случае вызывается метод реакции по умолчанию. Это гарантирует, что на все сообщения будет некоторая реакция.
Например, если пользователь, работая в окне, нажал кнопку на мыши, результирующее сообщение Windows будет нести регулятор этого окна. В результате объект окна получает сообщение для типа которого может быть определен метод реакции, а может быть - нет. Ес
ли метод реакции не определен, ObjectWindows вызывает метод реакции по умолчанию, метод объекта DefWndProc. Обработка сообщения по умолчанию описана в Главе 9, "Объекты интерфейса".
Параметры сообщения Windows
Каждое сообщение Windows поступает с регулятором на структуру сообщения с шестью полями. Два из них предназначены для внутреннего использования Windows. Два другие, регулятор окна и идентификатор сообщения, используются ObjectWindows используются для нап
равления корректного сообщения корректному окну. Только два параметра содержат данные, непосредственно полезные вашей программе.
wParam имеет тип Word и содержит одну часть информации, обычно регулятор, идентификатор или код. Например, выбор из меню генерирует сообщение wm_Command, wParam которого содержит ID выбранного элемента меню.
lParam имеет тип Longint и обычно содержит две части информации, одну в низшем порядке Word, а другую - в его старшей части. lParam обычно содержит более сложные данные, например, координаты точек или указатели на строки (PChar). Например, сообщение wm_L
ButtonDown, генерируемое при нажатии пользователем левой кнопки на мыши в окне, содержит координату x в младшей части слова lParam и координату y в его старшем разряде. TMessage определена как вариантная запись, поэтому можно получить доступ к младшему и
 старшему разряду соответственно через lParamLo и lParamHi.
Типы сообщений Windows
Ниже приводится список всех сообщений, которые может воспринимать приложение Windows.
Сообщения управления окном
Эти сообщения служат сигналом изменения состояния окна. Например, wm_Close посылается при закрытии окна, а wm_Paint посылается, когда нужно перерисовать часть или все окно.
Сообщение инициализации
Эти сообщения посылаются при создании программой меню (wm_InitMenu) или блока диалога (wm_InitDialog).
Сообщения ввода
Эти сообщения являются результатом ввода через мышь (wm_MouseMove), клавиатуру (wm_Char), линейку прокрутки (wm_VScroll) или таймер системы (wm_Timer). Одно из самых общих сообщений ввода wm_Command, которое происходит при выборе из меню или из акселерат
ора, или от управляющего события (нажатие кнопки).
Сообщения системы
Эти сообщения посылаются в ответ на манипулирование пользователем стандартных аксессуаров приложения: блока меню управления, линеек прокрутки клавиши изменения размеров. Как результат выбора из блока меню управления посылается wm_SysCommand. Большинство 
приложений не воспринимают системные сообщения.
Сообщения буфера вырезанного изображения
Эти сообщения посылаются в результате того, что другое приложение делает попытку получить доступ к буферу вырезанного изображения вашего окна.
Сообщения системной информации
Эти сообщения посылаются при изменении атрибутов на системном уровне Windows, например, цвета (wm_SysColorChange) или шрифта (wm_FontChange).
Контрольно-управляющие сообщения
Эти сообщения посылаются приложением на его управления, например, блоки списка или кнопки. Каждый тип управления понимает свой собственный набор сообщений запросов и установок атрибутов. Управляющие сообщения отличаются от всех других сообщений (кроме MD
I) тем, что они не информируют приложение о событии, а а сами вызывают событие.
Контрольно-информационные сообщения
Сообщения wm_Command информируют родительское окно об управляющем событии (например, выбор элемента из блока списка или ввод редактирующего управления). Параметры сообщения задают конкретный код извещения, например: lbn_SelChange или en_Change. 
Информационные сообщения линейки прокрутки
Это специализированные сообщения для управления линейкой прокрутки. Всего есть два таких сообщения: wm_HScroll и wm_VScroll.
Сообщения из области не принадлежащей клиенту
Эти сообщения аналогичны сообщениям ввода, но относятся к событиям, происходящим вне области клиента окна, включая его меню, заголовок и рамки. Эти сообщения следующие: wm_NCMouseMove и wm_NCPaint. Обычно ваше приложение не должно обрабатывать такие сооб
щения.
Сообщения интерфейса нескольких документов (MDI)
Эти сообщения посылаются приложением, которое следует стандарту MDI по манипулированию дочерними окнами. Есть сообщения MDI wm_MDIActivate и MDIDestroy.
Обработка сообщений по умолчанию
Некоторые сообщения Windows требуют конкретных действий по умолчанию или возвращаемого значения. Функция Windows DefWindowProc предоставляет действия по умолчанию для каждого сообщения. ObjectWindows автоматически вызывает DefWindowProc для каждого проиг
норированного сообщения. Однако, взаимодействие этих сообщений с методами реакции может предотвратить требуемые действия. Это имеет место только для некоторых сообщений Windows и в этом случае нужно вызвать DefWindowProc непосредственно (через метод TWin
dowsObject DefWndProc).
Посылка сообщений
Одним из источников сообщений является сама ваша программа. Ваша программа может вызвать функцию Windows SendMessage. В результате этого ваша программа получит сообщение. Этот метод полезен для моделирования событий из вашей программы.
SendMessage наиболее удобен при манипулировании управлениями, например, блоками списка и кнопками. Windows определяет такие сообщения, как добавление элементов в блок списка (lb_AddString) или изменение состояния блока проверки (bm_SetCheck). Управляющие
 объекты ObjectWindows определяют такие методы, как TListBox.AddString и TCheckBox.SetCheck, которые посылают многие из этих сообщений (наиболее часто используемые) связанным с ними элементам интерфейса. Если вы хотите послать более сложные сообщения по 
управлению вашим окном, используйте SendMessage с управлением HWindow в качестве первого (Wnd) параметра.
Если вы хотите послать сообщение управлению в блоке диалога, то  процедура будет несколько иной. Часто управления ваших объектов TDialog не будет иметь собственных объектов интерфейса, связанных с ними. Вы можете посылать им сообщения используя метод TDi
alog SendDlgItemMsg. Можно обеспечить связь с вашими блоками диалога организовав с ними объекты интерфейса с помощью конструктора InitResource. См. раздел "Объединение объектов управления" в Главе 11.
Диапазон сообщения
Поскольку сообщения определяются значениями типа Word, имеется возможность существования 65536 сообщений. Windows разделяет сообщения на конкретные диапазоны групп стандартных сообщений Windows, командных сообщений, информационных сообщений и т.д. Для бо
лее простой идентификации этих диапазонов ObjectWindows определяет специальные константы, которые используются как отклонения в отдельных диапазонов. Диапазоны сообщений и константы ObjectWindows приводятся в Таблице 7.1.
Таблица 7.1. Диапазоны сообщений Windows
----------------------------------------------------------------
Константа      Значение  Диапазон       Значение
----------------------------------------------------------------
wm_First       $0000     $0000-$7FFF    Сообщения окна
wm_User        $0400     $0400-$8FFF    Задаваемые пользователем 
                                        сообщения
id_First       $8000     $8000-$8FFF    Сообщения дочерних ID
id_Internal    $8F00     $8F00-$8FFF    Зарезервировано для 
                                        внутреннего использования    
nf_First       $9000     $9000-$9FFF    Информационные сообщения
nf_Internal    $9F00     $9F00-$9FFF    Зарезервировано для 
                                        внутреннего использования
cm_First       $A000     $A000-$FFFF    Командные сообщения
cm_Internal    $FF00     $FF00-$FFFF    Зарезервировано для 
                                        внутреннего использования
----------------------------------------------------------------
Определяемые пользователем сообщения
Windows позволяет вам задавать ваши собственные сообщения для их использования вашим приложением. Определяемые пользователем сообщения очень удобны при возникновении новых событий и задании реакции на них. Например, вы можете заставить одно окно посылать
 определенное пользователем сообщение всем открытым окнам приложения.
С каждым сообщением Windows связан идентификатор типа Word. Для каждого из заранее определенных сообщений Windows ObjectWindows определяет соответствующую константу типа Word, которая используется в заголовке метода реакции на сообщение.
В диапазоне имеющихся идентификаторов сообщений Windows имеются значения, зарезервированные для определяемых пользователем сообщений. Диапазон заранее определенных сообщений Windows от 0 до wm_User-1. Диапазон определяемых пользователем сообщений от wm_U
ser то wm_User+31744. Вероятно, лучше всего определять сообщения пользователей в виде констант, начиная от wm_User, wm_User+1, wm_User+2 и т.д. Например,
const
 wm_MyFirstMessage=wm_User;
 wm_MySecondMessage=wm_User+1;
 wm_MyThirdMessage=wm_User+2;
Посылать ваше сообщение следует с использованием функции Windows SendMessage:
SendMessage(AWindow^.HWindow, wm_MyFirstMessage, AWord, ALongint);
Для принятие определенного пользователем сообщения нужно следовать процедуре, аналогичной стандартному сообщению Windows. Например,
MyWindow=object(TWindow)
 ...
 procedure WMMyFirstMessage(var Msg: TMessage); virtual wm_First +
  wm_MyFirstMessage;
 procedure WMMySecondMessage(var Msg: TMessage); virtual wm_First +
  wm_MySecondMessage;
 procedure WMMyThirdMessage(var Msg: TMessage); virtual wm_First +
  wm_MyThirdMessage;
end;



Яндекс цитирования