![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывод текста
Cobalt © (2012-06-17 20:15:00)Хочу отрисовать надпись ровно по центру строки
Делаю так:
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 пикселей снизу вылезает, и получается, что надпись идет не по центру :(
Как быть?
Cobalt (2012-06-18 12:57:00) [1]пока заливал белым, это было незаметно.
поменял цвет заливки - всплыло.
Cobalt (2012-06-18 12:54:00) [2]Нифига :-)
я в заливке белым перепутал высоту и ширину прямоугольника.
Омлет (2012-06-18 12:43:00) [3]
> Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width));
А ширину с высотой местами не перепутал? )
Rouse_ (2012-06-18 12:27:00) [4]Шлейф остался потому что у предыдущего ректа ширина была большая.
Cobalt (2012-06-18 12:20:00) [5]Вдогонку:
Несмотря на
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width));
при уменьшении высоты шрифта (и, соответственно, высоты прямоугольника), оставался шлейф от предыдущей отрисовки, как будто игнорируется очистка белым цветом
http://img546.imageshack.us/img546/9755/drawtext2fillrect.jpg
Омлет (2012-06-18 08:11:00) [6]К тому же, для вывода WideString необходимо использовать DrawText W.
Cobalt (2012-06-18 07:41:00) [7]а, да, точно :-)
Омлет (2012-06-18 01:22:00) [8]Ты б хоть в справку заглянул. DT_VCENTER должен идти в паре с DT_SINGLELINE.
Cobalt (2012-06-17 23:20:00) [9]
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-17 22:01:00) [10]Что такое delta?
Используй DrawText + DT_VCENTER, если текст однострочный.
Rouse_ (2012-06-17 21:47:00) [11]Не по центру по вертикали? Так это потому что ты выравнивание по вертикали нигде не сделал.