Hej,
Eksperymentuję z GDI+ w Delphi. Docelowo, chciałbym rysować wykres kołowy z antyaliasingiem (jest to dosyć proste do zrobienia, używając funkcji DrawArc).
Ale dzisiaj mam inny problem, wydawałoby się ten łatwiejszy... pozory jednak mylą.
Chciałbym narysować tekst na kontrolce TPaintBox, który jest w ustalonej pozycji (domyślnie wyśrodkowany).
Poniżej znajduje się prosty (pseudo)kod, który rysuje tekst na kontrole TPaintBox (o nazwie PB). Jak widać, tekst rysowany jest od lewego górnego rogu - celem jest wyrysowanie go NA ŚRODKU.
Jak ustawić tekst na środku (względem osi x i y)? Jak zmierzyć tekst (szerokość i wysokość)? Jak obliczyć położenie tekstu?
Eksperymentowałem też z kontrolką TLabel położoną na TPaintBox (wycentrowanie jest proste i działa - ale to bez sensu, skoro mogę to narysować w GDI+, skoro już tego używam).
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls, GDIPAPI, GDIPOBJ;
procedure DRAW_TEXT(AControl: TPaintBox; ASize: Integer; ATextColor: TColor; AProgress: Integer);
var
LRect : TRect;
Graphics : TGPGraphics;
sText : string;
iColor : Longint;
R, G, B : Byte;
FontFamily : TGPFontFamily;
Font : TGPFont;
PointF : TGPPointF;
SolidBrush : TGPSolidBrush;
xPos : Single;
yPos : Single;
begin
// Control Size
AControl.Width := ASize;
AControl.Height := ASize;
// Control Background (Only for test!)
LRect := AControl.ClientRect;
AControl.Canvas.Brush.Color:= $002C1705;
AControl.Canvas.Brush.Style:= bsSolid;
AControl.Canvas.Pen.Style:= psClear;
AControl.Canvas.FillRect(LRect);
// GDI+
Graphics := TGPGraphics.Create(AControl.Canvas.Handle);
try
// TEXT
sText := Inttostr(AProgress) + '%'; // 23%
FontFamily := TGPFontFamily.Create('Tahoma');
Font := TGPFont.Create(FontFamily, 96, FontStyleRegular, UnitPixel);
iColor := ColorToRGB(ATextColor);
R := iColor;
G := iColor shr 8;
B := iColor shr 16;
SolidBrush := TGPSolidBrush.Create(MakeColor(255, R,G,B));
// SET TEXT POSITION
xPos := 0.0; // !!! Round((AControl.Width div 2) - TEXT_WIDTH div 2)
yPos := 0.0; // !!! Round((AControl.Hight div 2) - TEXT_HEIGHT div 2)
// TEXT_WIDTH ????
// TEXT_HEIGHT ???
PointF := MakePoint(xPos,yPos);
Graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
Graphics.DrawString(sText, Length(sText), Font, PointF, SolidBrush);
FontFamily.Free;
Font.Free;
SolidBrush.Free;
finally
Graphics.Free;
end;
end;
procedure TForm1.PBPaint(Sender: TObject);
begin
DRAW_TEXT(PB, 340, $00C0C0C0, 23);
end;
Proszę o wskazówki...
-Pawel