Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывод текста


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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо