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

Вниз

Вывод текста   Найти похожие ветки 

 
Cobalt ©   (2012-06-17 20:15) [0]

Хочу отрисовать надпись ровно по центру строки
Делаю так:
 Canvas.Font := MonthesFont;
 StringWidth := Canvas.TextWidth(MonthesStr);
 TextRect := Rect(StrLeft,               ATop + delta,
                  StrLeft + StringWidth, ATop + delta + FMonthesHeight);
 Canvas.Brush.Color := clYellow;
 Canvas.FillRect(TextRect);
 Canvas.Brush.Color := clLime;
 Canvas.TextOut(TextRect.Left, TextRect.Top, MonthesStr);


а получается вот так:
http://desmond.imageshack.us/Himg690/scaled.php?server=690&filename=textout.jpg&res=landing

Желтый прямоугольник отрисовываю для иллюстрации области где хочу надпись.
5 пикселей снизу вылезает, и получается, что надпись идет не по центру :(
Как быть?


 
Rouse_ ©   (2012-06-17 21:47) [1]

Не по центру по вертикали? Так это потому что ты выравнивание по вертикали нигде не сделал.


 
Омлет ©   (2012-06-17 22:01) [2]

Что такое delta?
Используй DrawText + DT_VCENTER, если текст однострочный.


 
Cobalt ©   (2012-06-17 23:20) [3]

type
 TForm6 = class(TForm)
   Image1: TImage;
   SpinEdit1: TSpinEdit;
   procedure FormCreate(Sender: TObject);
   procedure SpinEdit1Change(Sender: TObject);
   procedure UpdateString;
 private
   { Private declarations }
   FontSize: Integer;
 public
   { Public declarations }
 end;

var
 Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.FormCreate(Sender: TObject);
begin
 FontSize := 12;
 SpinEdit1.Value := FontSize;
 UpdateString;
end;

procedure TForm6.SpinEdit1Change(Sender: TObject);
begin
 FontSize := SpinEdit1.Value;
 UpdateString;
end;

procedure TForm6.UpdateString;
var
 ARect: TRect;
 TextStr: string;
 TextHeight: Integer;
begin
 TextStr := "Июнь 2012";
 Image1.Invalidate;
 Image1.Canvas.Brush.Color := clWhite;
 Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width));
 Image1.Canvas.Font := self.Font;
 Image1.Canvas.Font.Size := FontSize;
 TextHeight := Image1.Canvas.TextHeight(TextStr);
 ARect := Rect(0, 0, 200, TextHeight*2);
 Image1.Canvas.Brush.Color := clYellow;
 Image1.Canvas.FillRect(ARect);
 Image1.Canvas.Brush.Color := clLime;
 DrawText(Image1.Canvas.Handle, PWideChar(TextStr), Length(TextStr), ARect, DT_VCENTER);
end;


Как-то не похоже что работает :(


 
Омлет ©   (2012-06-18 01:22) [4]

Ты б хоть в справку заглянул. DT_VCENTER должен идти в паре с DT_SINGLELINE.


 
Cobalt ©   (2012-06-18 07:41) [5]

а, да, точно :-)


 
Омлет ©   (2012-06-18 08:11) [6]

К тому же, для вывода WideString необходимо использовать DrawTextW.


 
Cobalt ©   (2012-06-18 12:20) [7]

Вдогонку:
Несмотря на
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width));

при уменьшении высоты шрифта (и, соответственно, высоты прямоугольника), оставался шлейф от предыдущей отрисовки, как будто игнорируется очистка белым цветом
http://img546.imageshack.us/img546/9755/drawtext2fillrect.jpg


 
Rouse_ ©   (2012-06-18 12:27) [8]

Шлейф остался потому что у предыдущего ректа ширина была большая.


 
Омлет ©   (2012-06-18 12:43) [9]


> Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width));

А ширину с высотой местами не перепутал? )


 
Cobalt ©   (2012-06-18 12:54) [10]

Нифига :-)
я в заливке белым перепутал высоту и ширину прямоугольника.


 
Cobalt ©   (2012-06-18 12:57) [11]

пока заливал белым, это было незаметно.
поменял цвет заливки - всплыло.



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

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

Наверх




Память: 0.49 MB
Время: 0.05 c
15-1350464720
AV
2012-10-17 13:05
2013.03.22
Подскажите запрос


15-1330374602
Юрий
2012-02-28 00:30
2013.03.22
С днем рождения ! 28 февраля 2012 вторник


15-1349681511
Jeer
2012-10-08 11:31
2013.03.22
Отечественные микропроцессоры


1-1295644073
Wadimka
2011-01-22 00:07
2013.03.22
Конвертация даты в миллисекундах в TDateTime


2-1338866460
Alex_Y
2012-06-05 07:21
2013.03.22
Не останавливается Breakpoint