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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
14-1084212225
Drakon
2004-05-10 22:03
2004.05.30
Электронные учебники по Delphi


11-1073068424
Dentall
2004-01-02 21:33
2004.05.30
Проблема потоков в KOL (Stream2Stream)


8-1072430595
undersun
2003-12-26 12:23
2004.05.30
DSPack.SampleGrabber не грабит с камеры


14-1084200341
Gramila
2004-05-10 18:45
2004.05.30
Прерывания


4-1081936017
human
2004-04-14 13:46
2004.05.30
Время простоя ПК