Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизКак правильно вычислить координаты текста для потомка 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c