• Cobalt © (17.06.12 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_ © (17.06.12 21:47) [1]
    Не по центру по вертикали? Так это потому что ты выравнивание по вертикали нигде не сделал.
  • Омлет © (17.06.12 22:01) [2]
    Что такое delta?
    Используй DrawText + DT_VCENTER, если текст однострочный.
  • Cobalt © (17.06.12 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;



    Как-то не похоже что работает :(
  • Омлет © (18.06.12 01:22) [4]
    Ты б хоть в справку заглянул. DT_VCENTER должен идти в паре с DT_SINGLELINE.
  • Cobalt © (18.06.12 07:41) [5]
    а, да, точно :-)
  • Омлет © (18.06.12 08:11) [6]
    К тому же, для вывода WideString необходимо использовать DrawTextW.
  • Cobalt © (18.06.12 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_ © (18.06.12 12:27) [8]
    Шлейф остался потому что у предыдущего ректа ширина была большая.
  • Омлет © (18.06.12 12:43) [9]

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

    А ширину с высотой местами не перепутал? )
  • Cobalt © (18.06.12 12:54) [10]
    Нифига :-)
    я в заливке белым перепутал высоту и ширину прямоугольника.
  • Cobalt © (18.06.12 12:57) [11]
    пока заливал белым, это было незаметно.
    поменял цвет заливки - всплыло.
Есть новые Нет новых   [134428   +39][b:0][p:0.002]