Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-78063
Дмитрий К.К.
2003-07-07 06:13
2003.07.24
Именинники 7 июля


1-77868
AndrewVolkov
2003-07-13 18:28
2003.07.24
Com port - ReadFile???


3-77725
boka
2003-06-27 09:24
2003.07.24
Как из txt перебросить данные в dbf


1-77885
Не знающий
2003-07-09 23:53
2003.07.24
Закрытие формы в её FormActivate


14-78083
UserName
2003-07-07 23:34
2003.07.24
Компонент для передачи файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский