Связь с родительским элементом управления
Механизм связывания визуального компонента с родительским компонентом (владельцем) позволяет автоматически задавать для нового элемента управления некоторые свойства, отвечающие за его внешний вид (см. выше). В результате все дочерние элементы управления для одного родительского (формы, панели) будут выглядеть одинаково оформленными.
Родительский компонент задается свойством
property Parent: TWinControl;
Для каждого дочернего элемента управления можно задать значения нескольких свойств:
property ParentBiDiMode: Boolean; property ParentColor: Boolean; property ParentFont: Boolean; property ParentShowHint: Boolean;
Каждое из них управляет одной характеристикой визуализации элемента. Метод
function HasParent: Boolean; override;
используется для того, чтобы определить, имеется ли у компонента владелец вообще.
В классе TControl впервые появляются методы-обработчики событий, которые обеспечивают передачу в элемент действия мыши, присоединение и перетаскивание.
Класс TWinControl
Класс TWinControl обеспечивает создание и использование оконных элементов управления (см. выше). Напомним, что оконный элемент управления имеет системный дескриптор окна hwnd. Однако оконными элементами являются не только формы и диалоги, но и большинство стандартных элементов управления.
Новые механизмы, инкапсулированные в классе, обеспечивают выполнение характерных для оконных элементов функций: прием и передачу фокуса, отклик на действия мышью и ввод с клавиатуры и т. д. Рассмотрим основные свойства и методы класса.
Дескриптор окна содержится в свойстве
property Handle: HWND;
При создании оконного элемента управления вызывается метод
procedure CreateParams(var Params: TCreateParams); virtual;
который заполняет структуру TCreateParams необходимыми значениями:
type
TCreateParams = record
Caption: PChar;
Style: DWORD;
ExStyle: DWORD;
X, Y: Integer;
Width, Height: Integer;
WndParent: HWND;
Param: Pointer
WindowClass: TWndClass;
WinClassName: array[0..63] of Char;
end;
Для создания дескриптора окна для элемента управления используется метод
procedure CreateHandle; virtual;
Операционная система создает дескриптор окна только вместе с самим окном. Поэтому метод CreateHandle только создает окно, а для присваивания свойству Handle значения дескриптора окна вызывает метод createwnd.
Для передачи фокуса между элементами управления на одной форме часто используется клавиша <Таb>. Порядок перемещения фокуса между элементами определяется свойством
type TTabOrder = -1..32767;
property TabOrder: TTabOrder;
В первую очередь фокус передается компоненту с минимальным значением свойства. Далее — по возрастанию значения. При переносе компонента на форму это значение задается автоматически в соответствии с числом компонентов на форме.
Компонент можно заставить не откликаться на клавишу <Таb>. Для этого свойству
property TabStop: Boolean;
необходимо присвоить значение False.
Для передачи фокуса прямо элементу управления применяется метод
procedure SetFocus; virtual;
Чтобы узнать, имеет ли элемент управления фокус, в настоящее время используется метод
function Focused: Boolean; dynamic;
Все оконные элементы имеют рамку по контуру (впрочем, она может быть не видна). Ее параметры задаются группой свойств:
- property BevelEdges: TBevelEdges;
задает, какие стороны входят в рамку;
- property Bevellnner: TBevelCut; property BevelOuter: TBevelCut;
задают внешний вид рамки;
- property BevelKind: TBevelKind;
определяет стиль рамки;
- property BevelWidth: TBevelWidth;
задает размер рамки.
Свойство
property Brush: TBrush;
определяет параметры кисти (цвет и заполнение), которой рисуется фон элемента.
Оконный элемент может содержать другие компоненты. Для управления ими применяется индексированный список указателей, представляющих свойство
property Controls[Index: Integer]: TControl;
Общее число дочерних элементов управления содержится в свойстве
property ControlCount: Integer;
Внешний вид оконного элемента определяется свойством
property Ctl3D: Boolean
При значении True элемент управления имеет трехмерный вид. Иначе элемент выглядит плоским.
Для вызова темы контекстной помощи для конкретного элемента управления предназначено свойство
type THelpContext = -MaxLonglnt..MaxLonglnt;
property HelpContext: THelpContext;
Значение свойства должно соответствовать номеру темы в файле помощи.
В классе TwinControl добавлена возможность использования редакторов способа ввода (Input Method Editor, IME). Такие редакторы позволяют приспособить стандартную раскладку клавиатуры для символьных языков для ввода нестандартных символов (иероглифов и т. д.). Редакторы IMЕ представляют собой специально устанавливаемое в операционной системе программное обеспечение (ПО). Имя такого редактора задается в свойстве ImeName. Режим работы редактора определяется свойством ImeMode.
В классе TwinControl добавлено еще несколько методов-обработчиков событий, обеспечивающих реакцию на ввод с клавиатуры, получение и потерю фокуса.
Класс TCustomControl
Класс TCustomControl предназначен для создания на его основе нестандартных оконных элементов управления. Процесс визуализации в нем упрощен за счет использования специального класса TCanvas, инкапсулирующего канву (см. гл. 11).
Доступ к канве осуществляется через свойство
property Canvas: TCanvas;
Отрисовка элемента управления осуществляется методом
procedure PaintWindowfDC: HDC); override;
после получения сообщения WM_PAINT.
Возможности этого класса унаследовали классы TPanel, TGroupBox, TStringGrid и т. д.
Класс TGraphicControl
Класс TGraphicControl предназначен для создания на его основе визуальных компонентов, не получающих фокус в процессе выполнения приложения. Так как непосредственным предком класса является класс TControl, то потомки TGraphicControl умеют реагировать на управляющие воздействия мышью.
Наглядный пример элемента управления, которому не нужно получать фокус, — это компонент TLabel, предназначенный для отображения текста, или компонент Timage, предназначенный для визуализации изображений.
Для визуализации элементов управления на основе этого класса используется канва, инкапсулированная в классе TCanvas.
Доступ к канве осуществляется через свойство
property Canvas: TCanvas;
Отрисовка элемента управления осуществляется методом
procedure PaintWindow(DC: HDC); override;
после получения сообщения WM_PAINT.
Резюме
В настоящей главе рассмотрены важнейшие свойства и методы базовых классов, лежащих в основе VCL. Зная возможности этих классов, вы тем самым будете знать назначение многих свойств и методов в компонентах VCL. Поэтому материал данной главы будет полезен при изучении любых вопросов, рассматриваемых в этой книге в дальнейшем