Методы void TControl::BringToFront(void) и void TControl::SendToBack(void) управляют Z-порядком компонента, помещая его на передний или задний план соответственно.
Метод TControl::WndProc(TMessage &Message) обрабатывает поступившие органу управления сообщения Message класса TMessage. Адрес этого метода хранится в свойстве WindowProc, описанном в секции public. Это позволяет подменять стандартный обработчик и производить самостоятельную обработку каких-либо сообщений.
Таким образом, возможность обработки сообщений операционной системы появляется уже в классе TControl. Этот класс обрабатывает только сообщения от мыши, но его потомки способны обрабатывать и другие сообщения операционной системы Windows. В результате обработки сообщений от мыши у класса TControl появляются следующие события: OnClick, OnDblClick, OnMouseDown, OnMouseMove, OnMouseUp. Задав обработчики этих событий, можно определить реакцию компонента на манипуляции мышью.
Кроме того, в классе TСontrol появляются также свойства, методы и события, реализующие механизм Drag-and-Drop.
Класс TControl редко используется непосредственно, большинство компонент являются производными от TWinControl или TGraphicControl.
Класс TWinControl является предком всех оконных элементов управления. С каждым таким элементом управления связано окно («window») операционной системы Windows. Производные от TWinControl компоненты обладают тремя основными характеристиками: они имеют оконные дескрипторы (HWND), способны принимать фокус ввода и могут являться родителями других элементов управления. В классе TWinControl полностью определяется отношение "старший-младший", для этого добавляются следующие свойства.
int TWinControl::ControlCount содержит количество младших элементов управления для данного компонента (ReadOnly, RunTime).
TControl* TWinControl::Controls[int Index] содержит массив указателей младших элементов управления для данного компонента (ReadOnly, RunTime). Нумерация начинается с 0. Компонент добавляется и удаляется из соответствующих массивов при изменении свойства Parent. Кроме того, для добавления и удаления компонента в список младших компонентов можно использовать методы void TWinControl::InsertControl(TControl *AControl) и void TWinControl::RemoveControl (TControl *AControl).
Метод bool TWinControl::ContainsControl(TControl* Control) определяет, может ли данный компонент управлять компонентом Control, т. е. является ли Control младшим для данного компонента непосредственно или косвенно.
TControl* TWinControl::ControlAtPos(TPoint &Pos, bool AllowDisabled) возвращает указатель на младший компонент расположенный в заданных координатах клиентской области данного компонента.
Таким образом, все компоненты С++Builder находятся в отношении "основной-вспомогательный". Как уже говорилось, это отношение отвечает за владение компонентами. Когда уничтожается основная компонента, уничтожаются и все вспомогательные компоненты. Для всех компонент, помещенных на форму, основной является форма, для всех форм основным является приложение Application, экземпляр класса TApplication. Таким образом, если приложение завершается, то закрываются и все формы, и, соответственно, уничтожаются все принадлежащие им компоненты. Причем для форм и приложения есть и обратное воздействие. Среди всех форм одна должна быть главной, ссылка на нее содержится в свойстве MainForm объекта Application. Обычно главной формой становится первая созданная форма. Изменить главную форму можно в опциях проекта на закладке Forms в поле MainForm. Закрытие главной формы приводит к завершению приложения, что в свою очередь приводит к закрытию и всех остальных форм. Следует особо отметить, что при запуске приложения главная форма отображается независимо от значения свойства Visible. Затем это форма может быть скрыта обычными способами. Однако программист в случае скрытия главной формы должен предусмотреть какие-либо варианты завершения приложения, поскольку закрытие пользователем всех остальных форм не приведет к завершению приложения. Если все-таки необходимо скрыть главную форму при запуске приложения, то можно использовать свойство ShowMainForm объекта TApplication. Все отображаемые компоненты связаны еще отношением "старший-младший". Старшим компонентом может быть как сама форма, так и какой-либо группирующий компонент, например TGroupBox. В общем случае старшим может быть любой производный от TWinControl компонент, например TButton. Отношение "старший-младший" отвечает за отображение компонентов. Таким образом, если старший компонент перемещается, то перемещаются и все младшие, если он скрывается, то скрываются и все младшие, если он становится недоступным, то недоступны и все младшие. Все координаты компонента также задаются относительно старшего компонента. Формы не имеют старшего компонента, и значение свойства Parent у них равно NULL.
В классе TWinControl также появляются дополнительные характеристики, отвечающие за отображение компонента.
Свойство bool TWinControl::Showing определяет, может ли компонент быть видимым, т. е. равно ли свойство Visible этого компонента и всех старших компонент true.
Свойство bool TWinControl::CanFocus определяет, может ли компонент принять фокус ввода, т. е. равны ли свойства Visible и Enabled этого компонента и всех старших компонент true.
Свойство bool TWinControl::Focused возвращает значение true, если компонент находится в фокусе ввода.
Метод void TWinControl::SetFocus(void) активизирует компонент, т. е. передает ему фокус ввода.
Свойство bool TWinControl::TabStop – определяет, находится ли данный компонент в TAB-порядке старшего компонента и может ли быть активизирован при помощи клавиши TAB.
Свойство int TWinControl::TabOrder определяет положение в TAB-порядке старшего компонента.
Свойство HWND TWinControl::Handle содержит оконный дескриптор объекта Windows, который инкапсулирует компонент TWinControl. Этот дескриптор может использоваться в Win32 API функциях для работы с компонентом как с обычным окном системы Windows.
Кроме метода WndProc класс TWinControl имеет еще невиртуальный метод void TWinControl::MainWndProc(TMessage &Message), который сообщается системе Windows как функция окна. Внутри этого метода происходит попытка вызвать метод, адрес которого хранится в свойстве WindowProc (по умолчанию WndProc), и в случае неудачи вызывается Appliction->HandleException. В отличие от TControl, класс TWinControl позволяет обрабатывать любые сообщения Windows. В частности происходит обработка сообщений от клавиатуры и сообщения связанные с фокусом ввода, в результате чего у класса TWinControl появляются следующие события: OnKeyDown, OnKeyPress, OnKeyUp, OnEnter и OnExit.
Метод void TWinControl::Broadcast(void *Message) используется для рассылки сообщения Message всем младшим элементам управления. Благодаря этому методу компоненты, наследованные от TControl, получают возможность обработки некоторых сообщений, например, сообщений от мыши, сообщений, связанных с перерисовкой и т. д.
Большинство компонент не наследуются непосредственно от TWinControl. Для стандартных органов управления существуют специализированные классы TButtonControl, TCustomComboBox, TCustomEdit, TCustomListBox и т. д. Дополнительные органы управления наследуются обычно от класса TCustomControl.
Компоненты, производные от класса TGraphicControl, в отличие от TWinControl, не имеют оконного дескриптора, не имеют функции окна, не могут принять фокус ввода и не могут являться родителями других элементов управления. Производные TGraphicControl используются в тех ситуациях, когда необходимо изобразить на форме текст или графику, не обращаясь к функциональным возможностям обычных оконных элементов управления. Отметим следующие достоинства такого подхода. Во-первых, TGraphicControl не пользуется системными ресурсами Windows, так как не требует оконного дескриптора. Во-вторых, метод рисования TGraphicControl исполняется немного быстрее за счет того, что перерисовка компоненты не связана с диспетчеризацией сообщений Windows, а реализуется процессом рисования, заложенным в родителе данного компонента.
Свойство TCanvas * TGraphicControl::Canvas возвращает указатель на класс TCanvas, предоставляющий холст для рисования. Класс TCanvas инкапсулирует GDI возможности, предоставляемые операционной системой Windows. Он содержит различные свойства и методы, позволяющие производить различные графические операции. Свойство HDC TCanvas::Handle позволяет получить доступ к контексту отображения, связанному с клиентской областью компонента. Этот дескриптор может быть передан Win32 API GDI функциям для работы с контекстом отображения непосредственно.
Метод void TGraphicControl::Paint(void) вызывается в ответ на сообщение WM_PAINT, принимаемое родительским элементом управления. В классе TGraphicControl этот метод является защищенным. Метод Paint переопределяется в потомках и рисует изображение графического элемента управления.
Основными потомками являются TСustomLabel, TShape, TImage.
Класс TCustomControl, является непосредственным потомком TWinControl. Однако подобно TGraphicControl в этом классе добавляются свойство Canvas и метод Paint. Благодаря этому упрощается процедура рисования изображения компонента.
Остальные компоненты в иерархии содержат специфичные свойства, методы и события для различных групп компонентов (например, TButtonControl для кнопок) и их рассмотрение выходит за рамки данного учебного пособия.
Вывод
Система С++Builder содержит большой набор различных компонент, основная функциональность которых определена базовыми классами. Компоненты являются дальнейшим развитием классов, могут существовать как во время выполнения приложения, так и на этапе проектирования. В дополнении к данным и функциям класса, компоненты имеют также свойства и события. Все действия, доступные на этапе проектирования (например, изменение значений свойств и назначение обработчиков событий), программист может исполнять и на этапе выполнения. Все компоненты находятся в отношении "основной-вспомогательный", все отображаемые компоненты находятся в отношении "старший-младший". Компоненты TWinControl позволяют обрабатывать любые сообщения Windows. Любые функциональные возможности, предоставляемые системой и не реализованные в тех или иных компонентах, могут быть реализованы с помощью WIN32 API функций.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |


