-
Хочу отрисовать надпись ровно по центру строки Делаю так: 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 пикселей снизу вылезает, и получается, что надпись идет не по центру :( Как быть?
-
Не по центру по вертикали? Так это потому что ты выравнивание по вертикали нигде не сделал.
-
Что такое delta? Используй DrawText + DT_VCENTER, если текст однострочный.
-
type
TForm6 = class(TForm)
Image1: TImage;
SpinEdit1: TSpinEdit;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure UpdateString;
private
FontSize: Integer;
public
end;
var
Form6: TForm6;
implementation
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; Как-то не похоже что работает :(
-
Ты б хоть в справку заглянул. DT_VCENTER должен идти в паре с DT_SINGLELINE.
-
а, да, точно :-)
-
К тому же, для вывода WideString необходимо использовать DrawTextW.
-
Вдогонку: Несмотря на Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width)); при уменьшении высоты шрифта (и, соответственно, высоты прямоугольника), оставался шлейф от предыдущей отрисовки, как будто игнорируется очистка белым цветом http://img546.imageshack.us/img546/9755/drawtext2fillrect.jpg
-
Шлейф остался потому что у предыдущего ректа ширина была большая.
-
> Image1.Canvas.FillRect(Rect(0,0,Image1.Height, Image1.Width));
А ширину с высотой местами не перепутал? )
-
Нифига :-) я в заливке белым перепутал высоту и ширину прямоугольника.
-
пока заливал белым, это было незаметно. поменял цвет заливки - всплыло.
|