Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Как правильно вычислить координаты текста для потомка TLabel?   Найти похожие ветки 

 
Aleksandr ©   (2003-07-10 15:47) [0]

Я создал потомка TLabel - TMarkedLabel, со свойствами Offset, MarkValue, MarkFont. То есть у него, если в Caption написать Имя*, а в MarkValue поставить * и цвет MarkFont сделать красным, то он нарисует "Имя" и рядом поставит красную звездочку. Соответственно, пришлось переопределить метод tLabel.DoDrawText (с override):


procedure TMarkedLabel.DoDrawText(var Rect: TRect; Flags: Integer);
var
Text : string;
R : TRect;
s : string;
w : integer;
begin
// базовый код
Text := GetLabelText;
if (Flags and DT_CALCRECT <> 0) and ((Text = "") or ShowAccelChar and
(Text[1] = "&") and (Text[2] = #0)) then Text := Text + " ";
if NOT ShowAccelChar then Flags := Flags or DT_NOPREFIX;
Flags := DrawTextBiDiModeFlags(Flags);
Canvas.Font := Font;
// мой код
if IsMarked then begin //если установлена метка
// вычисляем, на сколько пробелов надо заменить текст метки в Caption
s:=" ";
Canvas.Font:=FMarkFont;
w:=Canvas.TextWidth(FMarkValue)+FOffset+2;
Canvas.Font:=Font;
while Canvas.TextWidth(s)<w do
s:=s+" ";
// и, соответственно, заменяем
Text:=ReplaceString(FMarkValue,S,Text);
Canvas.Font:=FMarkFont;
Canvas.Font:=Font
end;
// базовый код
if not Enabled then begin
OffsetRect(Rect, 1, 1);
Canvas.Font.Color:=clBtnHighlight;
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
OffsetRect(Rect, -1, -1);
Canvas.Font.Color := clBtnShadow;
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
end
else
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
Canvas.Font := Font;
// мой код
if IsMarked then begin // если есть метка
R:=Rect;
R.Left:=R.Left+FOffset+Canvas.TextWidth(System.Copy(Caption,1,Pos(FMarkValue,Caption)-1));
Canvas.Font:=FMarkFont;
DrawText(Canvas.Handle,PChar(FMarkValue),length(FMarkValue),R,Flags);
end
end;


Этот код хорош, но только пока используешь Alignment=taLeftJustify. А как вычислить координаты прямоугольника для метки, если выключка по центру или вправо?


 
Skier ©   (2003-07-10 15:52) [1]

TMarkedLabel.BoundsRect ?


 
Aleksandr ©   (2003-07-10 15:58) [2]

Не понимаю :(. Для меня это новая область. Насколько я понимаю, винды при вызове DrawText сами текст форматируют по флагам. А учитывая, что текст истчо может оказаться и врапнутым, так просто крыша едет при попытке понять, как вычислять, в какое место зафигачить эту метку.



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
3-77727
Солер
2003-06-30 17:41
2003.07.24
Из DBGrid1 в DBGrid2


4-78198
Yasha
2003-05-22 15:11
2003.07.24
Окна других программ


14-78118
sucer
2003-07-08 05:00
2003.07.24
Как получить изображение?


7-78162
DVM
2003-05-15 13:32
2003.07.24
Как вызвать диалог


14-78110
BOA_KAA
2003-07-08 13:06
2003.07.24
Компонент типа TStringGrid