Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

OwnerDraw TLabel   Найти похожие ветки 

 
IrBisoff ©   (2004-05-16 04:38) [0]

Как можно сделать сабж ? Вроде бы простой вопрос, но я чего-т пасую... Нужно выделить первый символ лэйбла другим цветом. Если не сложно - ответьте кодом.


 
Mim1 ©   (2004-05-16 07:29) [1]

PaintBox, OnPaint
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Font.Color := clRed;
PaintBox1.Canvas.TextOut(0,0,"B");
PaintBox1.Canvas.Font.Color := clBlack;
PaintBox1.Canvas.TextOut(PaintBox1.Canvas.TextWidth("B"),0,"egin");
end;


 
IrBisoff ©   (2004-05-16 07:51) [2]


> PaintBox, OnPaint


Ок, понял, спасибо, но это видимо ещё не всё. При такой прорисовке Tlabel"a он ведёт себя очень странно - повляется только при автоматической перерисовке (убрать за видимую область экрана и вернуть назад к примеру), а вот при принудительной (Form.Repaint), да и вообще сразу после прорисовки - его не видно. =( Есть мысль, что поверх него рисуется стандартный кэпшн. =\


 
IrBisoff ©   (2004-05-16 08:02) [3]

Уточнение: Вышенаписанное актуально в том случае, если вешать код на OnPaint формы (сколько не искал, у Tlabel Onpaint"a не нашёл =( ), а вот если вешать этот же код на событие (например, нажатие кнопки), то он ведёт себя с точностью до наоборот. =\


 
Mim1 ©   (2004-05-16 10:36) [4]

примерно так

unit MimLabel;

interface

uses
 SysUtils, Classes, Controls, StdCtrls;

type
 TMimLabel = class(TLabel)
 private
   { Private declarations }
 protected
   procedure Paint; override;
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;

implementation

uses Graphics;

procedure Register;
begin
 RegisterComponents("Standard", [TMimLabel]);
end;

{ TMimLabel }

procedure TMimLabel.Paint;
begin
 inherited;
 if length(text) > 0 then
   begin
     Canvas.Font.Color := clRed;
     Canvas.TextOut(0,0,copy(text,1,1));
     Canvas.Font.Color := clBlack;
     Canvas.TextOut(Canvas.TextWidth(copy(text,1,1)),0,copy(text,2,maxint));
   end;  
end;

end.


 
IrBisoff ©   (2004-05-16 10:56) [5]


> примерно так

Большое спасибо, хотя можно было настолько и не расписывать. ;)


 
IrBisoff ©   (2004-05-16 11:23) [6]


> PaintBox, OnPaint


Ага, есть ещё один вопрос - как быть со сглаживанием ? В Tlabel сглаживание присутствует изначально, а вот если на канве рисовать текстом - сглаживание улетучивается "как с белых..". =(


 
Mim1 ©   (2004-05-16 11:29) [7]

В приведенном компоненте сглаживание есть.
Вы наверное опять что нибудь не так делаете.


 
IrBisoff ©   (2004-05-16 11:38) [8]


> В приведенном компоненте сглаживание есть.
> Вы наверное опять что нибудь не так делаете.


Абсолютно всё. =) Я использую это не как компонент, а всего лишь как класс, эт раз. Я не просто делаю Canvas.Font.Color := clRed;, а вот так:

    if BigFirst then begin
      Canvas.Font := Freader.LabelCustomTitle.Font;
      Canvas.TextOut(0,0,copy(text,1,1));
      Canvas.Font := Freader.LabelCustom.Font;
      Canvas.TextOut(Canvas.TextWidth(copy(text,1,1)),0,copy(text,2,maxint));
    end else Canvas.TextOut(0,0,copy(text,1,maxint));
, эт два.
А третий пункт - шрифт там Sylfaen. Конечно, для MS Sans Serif можно сглаживание и не юзать. ;)


 
Mim1 ©   (2004-05-16 11:46) [9]

Вообщем понятно что ничего не понятно. :)
Вообщем смотрите реализацию метода procedure TCustomLabel.Paint; и
procedure TCustomLabel.DoDrawText(var Rect: TRect; Flags: Longint);

Если шрифт меняется то прямоугольник метки надо перерасчитывать (если autosize = true) вместо вызова inherited в моем коде.


 
IrBisoff ©   (2004-05-16 12:25) [10]


> Если шрифт меняется то прямоугольник метки надо перерасчитывать
> (если autosize = true) вместо вызова inherited в моем коде.


Вот. Прямо в точку. =) Я как-то об этом не подумал. На самом деле у первого символа меняется не только цвет, но и аттрибут fsBold, следовательно строка смещается и кажется, что она не сглажена. Ведь фактически прорисовка идёт по верху стандартной, а не вместо неё. =) Каюсь, грешен. =)

Итак, как перерассчитывать этот самый прямоугольник метки ? =D


 
IrBisoff ©   (2004-05-16 12:29) [11]

Хотя, впрочем, даже если я и не ставлю fsBold я получаю тот же эффект при шрифтах отличных от Sans"a. =\ Тут нужно каким-то образом заставить label не прорисовывать кэпшн, а делать это самому.


 
GuAV ©   (2004-05-16 12:51) [12]


> не прорисовывать кэпшн


У лабела, кроме заимствований от TGraphicControl все (imho) св-ва связаные с Catpion.
Начинай с TGraphicControl - никакого готового капшна не будет.


 
IrBisoff ©   (2004-05-16 13:07) [13]


> У лабела, кроме заимствований от TGraphicControl все (imho)
> св-ва связаные с Catpion.
> Начинай с TGraphicControl - никакого готового капшна не
> будет.


А как тогда реализовать Transparent ? Если бы не это проперти, можно было бы просто не вызывать в вышеприведенном коде inherited.


 
Mim1 ©   (2004-05-16 13:10) [14]

[13] IrBisoff ©   (16.05.04 13:07)

Вы внимательно изучили методы Paint и DoDrawText предка?


 
IrBisoff ©   (2004-05-16 13:17) [15]


> Вы внимательно изучили методы Paint и DoDrawText предка?

Нет, невнимательно. =) А можно пример оверрайда для DoDrawText ? =) Ленивый я по природе своей.. =(



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

Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
1-1084565683
AlexCo_
2004-05-15 00:14
2004.05.30
Кодировка


6-1081497901
bykopor
2004-04-09 12:05
2004.05.30
Программная шара!!! NetShareAdd


3-1084334558
BanderLog_t
2004-05-12 08:02
2004.05.30
Вопрос по UDF в FB 1.5


14-1084085591
Инкогнито
2004-05-09 10:53
2004.05.30
Про день Победы и немного о праздниках


3-1083839947
Alina
2004-05-06 14:39
2004.05.30
Дата???





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский