¬ составе API-функций Windows имеютс¤ такие, которые не нашли пр¤мой компонентной поддержки в VCL, но могут облегчить отрисовку компонентов. ¬се они объ¤влены в модуле Windows и доступны в любом компонентном модуле, который ссылаетс¤ на этот модуль.

ѕри объ¤влении прототипов функций используютс¤ многочисленные специфичные дл¤ Windows типы, которые также объ¤влены в модуле Windows. ѕри перечислении параметров обращени¤ часто примен¤етс¤ синтаксис ¤зыка -++, который чувствителен к регистру букв. Ќапример, непривычна¤ дл¤ Delphi конструкци¤ (hDC: HDC) просто объ¤вл¤ет параметр hDC типа HDC.  стати, многие функции требуют контекст устройства. ƒл¤ графических компонентов это обычно Canvas .Handle. ƒл¤ оконных компонентов, не имеющих свойства Canvas, его можно получить в конструкторе компонента вызовом функции Get DC:

DC := GetDC(Handle);
¬ деструкторе контекст нужно освободить с помощью функции ReleaseDC: ReleaseDC(Handle, DC);

Ќиже перечислены API-функции, предназначенные дл¤ отрисовки компонентов.

function OffsetRect(var Rect: TRect;
dX, dY: Integer): Bool;

-мещает пр¤моугольник Rect на dX пикселов вправо и на dY пикселов вниз (отрицательные значени¤ означают смещение влево и вверх). ¬озвращает True, если обращение успешно.

function InflateRect(var Rect: TRect;
dX, dY: Unteger): Bool;

”величивает ширину и высоту пр¤моугольника Rect соответственно на dX и dY пикселов (отрицательные значени¤ означают уменьшение размеров). ¬озвращает True, если обращение успешно.

function DrawFrameControl(hDC: HDC;
Rect: TRect;
uType: UINT;
uState: UINT): Bool;

ќтрисовывает рамку компонента:

Х hDC Ч контекст устройства;
Х Rect Ч пр¤моугольник отрисовки;
Х uType Ч тип компонента;

Х uState Ч уточнение типа компонента.

‘ункци¤ возвращает True, если отрисовка выполнена успешно. ƒл¤ задани¤ типа компонента в параметре uType используютс¤ такие константы:

Х DFC_BUTTON Ч кнопка;
Х DFC_CAPTION Ч кнопка в строке заголовка;
Х DFC_MENU Ч меню;

Х DFC_SCROLL Ч полоса прокрутки.

ѕ-»ћ≈„јЌ»≈ -

¬се описываемые в этом разделе константы объ¤влены в модуле Windows. ѕо прин¤тому в -++ соглашению имена констант записываютс¤ прописными буквами. ¬ Delphi регистр букв не имеет значени¤.

ѕараметр uState уточн¤ет компонент. ≈го значени¤ завис¤т от параметра и“уре и перечислены в табл. 4.2.

“аблица 4.2. ѕараметры функции DrawFrameControl

uType

uState

ќписание

DFC_BUTTON

DFCS_BUTTON3STATE

“рехмерна¤ кнопка

DFCS_BUTTONCHECK

‘лажок

DFCSJUTTONPUSH

ќбычна¤ кнопка

owidctlpar

DFCSJ3UTTONRADIO

ѕереключатель

DFCS_BUTTONRADIOIMAGE

»зображение переключател¤

DFCS_BUTTONRADIOMASK

ћаска переключател¤

DFC_CAPTION

DFCS_CAPTIONCLOSE

 нопка закрыти¤ окна

DFCS_CAPTIONHELP

 нопка вызова справочной службы

DFCS_CAPTIONMIN

 нопка свертывани¤

DFCS_CAPTIONMAX

 нопка развертывани¤

DFCS__CAPTIONRESTORE

 нопка восстановлени¤ размеров

DFCJ4ENU

DFCS_M EN YARROW

”казатель подменю

DFCS_MENUBULLET

”казатель зависимого меню

DFCS_MENUCHECK

‘лажок в меню

DFCSCROLL

DFCS_SCROLLCOMOBOX

ѕолоса прокрутки в “-огп№о¬ох

DFCS_SCROLLDOWN

 нопка прокрутки вниз

DFCS_SCROLLUP

 нопка прокрутки вверх

DFCS_SCROLLRIGHT

 нопка прокрутки вправо

DFCS_CSROLLLEFT

 нопка прокрутки влево

DFCS_SCROLLSIZEGRIP

 нопка изменени¤ размеров в правом нижнем углу окна

Ёти значени¤ можно дополн¤ть следующими флагами:

Х DFCS_ADJUSTRECT Ч компонент корректирует границы;
Х DFCS_CHECKED Ч флажок установлен;
Х DFCS_FLAT Ч кнопка имеет плоские границы;
Х DFCS_INACTIVE Ч кнопка неактивна;
Х DFCS_MONO Ч кнопка имеет монохромные границы;

Х DFCS_PUSHED Ч кнопка нажата.

function DrawText(hDC: HDC;
Text: PChar;
Count: Integer;
var Rect: TRect;
uFormat: UINT): Integer;

¬ыводит Count символов текста Text в пр¤моугольнике Rect на устройстве hDC. ¬озвращает высоту текста в пикселах. ѕараметр uFormat определ¤ет формат вывода и может быть комбинацией следующих флагов:

Х DT_BOTTOM Ч прижимает текст к низу пр¤моугольника;
Х DT_CALCRECT Ч вычисл¤ет минимально необходимый дл¤ вывода пр¤моугольник, но не выводит текст (пр¤моугольник возвращаетс¤ в параметре Rect);
Х DT_CENTER Ч центрирует текст по горизонтали;
Х DT_ED I TCONTROL Ч дублирует свойства многострочного пол¤ и не выводит частично видимую последнюю строку;
Х DTJ2NDELLIPSIS Ч замен¤ет многоточием начальные символы маршрута доступа так, чтобы текст полностью уместилс¤ в пр¤моугольнике Rect (исходный текст не модифицируетс¤, если нет флага DT_MODI FYSTRING);
Х DT_PATHELLIPSIS Ч “ќ же, „“ќ » DTJ2NDELLIPSIS, но замен¤ет -»ћ¬ќЋџ в середине маршрута доступа, сохран¤¤ последнюю часть;
Х DTJ2XPANDTABS Ч замен¤ет символы табул¤ции 8-кратной средней шириной символа;
Х DTJ2XTERNALLEADING Ч учитывает межстрочное рассто¤ние при вычислении высоты строки;
Х DT_JLEFT Ч прижимает строку влево;
Х DT_MODIFYSTRING Ч модифицирует строку при флагах DT_ENDELLIPSIS »Ћ» DT__PATHELLIPSIS;
Х DT_NOCLIP Ч не отсекает текст границами пр¤моугольника;
Х DT_NOPREFIX Ч отключает обработку управл¤ющих символов (без этого флага символ & не выводитс¤, а символ, следующий за ним, подчеркиваетс¤; символы && печатаютс¤ как один &);
Х DT_RIGHT Ч прижимает текст вправо;
Х DT_RTLREADING Ч печатает текст справа налево;
Х DT__SINGLELINE Ч выводит текст в виде одной строки, игнорирует символы конца строки;
Х DTJTABSTOP Ч устанавливает ширину символов табул¤ции;
Х DT_TOP Ч прижимает текст к верху пр¤моугольника;
Х DT_VCENTRE Ч центрирует текст по вертикали;

Х DTJTORDBREAK Ч разрешает разрыв строк на границах слов.

function SetBkMode(hDC: HDC;
BakMode: Integer): Integer;

”станавливает способ заполнени¤ фона при выводе текста. ѕараметр BakMode может принимать одно из двух значений:

Х Opaque Ч перед выводом текста, заполнением фона штрихующей кистью или вычерчиванием линии фон заполн¤етс¤ текущим цветом;

Х Transparent Ч отмен¤ет заполнение фона.

≈сли вызов успешен, возвращает прежнее значение режима, в противном случае Ч ноль.

functioin SetBkColor(hDC: HDC;
Color: TColor): TColor;

”станавливает новый фоновый цвет. ≈сли вызов успешен, возвращает прежний фоновый цвет, в противном случае Ч значение CLR_INVALID.

¬ приводимом далее обработчике (проект $(S0URCE)\Ch04\APIDemo\APIDemo. dpr) иллюстрируютс¤ некоторые приемы использовани¤ описанных функций.

ѕрограмма выводит в центре формы изображение крупной сфокусированной кнопки с трехмерной надписью.

procedure TForml.ButtonlClick(Sender: TObject); const

W = 150; H = 50; // -азмеры "кнопки"
Text = 'Caption1; // Ќадпись на ней var
X, Y: Integer; // Ћевый верхний угол R, RR: TRect;
begin
with Canvas do begin
X := (Width - W) div 2;
Y := (Height - H) div 2;
R := Rect(X, Y, X + W, Y + H) ;

// ќбводим периметр кнопки:

Rectangle (R.Left, R.Top, R.Right, R.Bottcfm) ;

// ”меньшаем размер пр¤моугольника, // чтобы не стереть обводку:

InflateRect(R, -1, -1);

// ќтрисовка пр¤моугольника кнопки:

DrawFrameControl(Handle, R, DFC_BUTTON, DFCS_BUTTONPUSH) ; // ќтрисовка пр¤моугольника из точек дл¤ кнопки с фокусом: InflateRect(R, -4, -4);
DrawFocusRect(R);

RR := R; // «апоминаем исходный пр¤моугольник

// ”станавливаем шрифт:

Font.Name := 'Times New Roman';
Font.Size 20;
Font.Style :=[fsBold];

// ѕолучаем пр¤моугольник дл¤ текста:

DrawText(Handle, PChar(Text), Length(Text), R, DT_CALCRECT); // -мещаем на 1 пиксел вверх и влево от центра: OffsetRect(R, (RR.Right - R.Right) div 2-1, (RR.Bottom - R.Bottom) div 2-1); // ¬ыводим светлую кромку текста: Font.Color := clBtnHighLight;
DrawText(Handle, PChar(Text), Length(Text), R, 0) ;

// ќтказ от отрисовки фона, чтобы не стереть уже выведенное:

SetBkMode(Handle, Transparent);

// ¬ыводим темную кромку текста:

OffsetRect(R, 2, 2);
Font.Color := clBtnShadow;
DrawText(Handle, PChar(Text), Length(Text), R, 0); // ¬ыводим основной текст: Of fsetRect (R, -1, -lb-Font. Color := clBlack;
DrawText(Handle, PChar(Text), Length (Text), R, 0);
end end;

4.4.5.  лассы TGraphic и TPicture || ќглавление || -оздание компонентов


Искусство создания компонентов Delphi



Новости за месяц

  • Август
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс