Zitat von
Muetze1:
Deine TLogFont Struktur hast du auch einen Font
Handle mit CreateFontIndirect() angelegt und auch dem Canvas.Font gegeben? Canvas.TextWidth() bezieht immer den aktuellen Font des Canvas (
DC) mit ein, und dass ist die Font Eigenschaft des Canvas.
'türlich - der Text wird ja korrekt gestaucht gezeichnet. In der Schleife selbst rufe ich geflissentlich mein SetFont auf:
Delphi-Quellcode:
procedure TMyPage.SetFont(AFont: TFont);
begin
with C.Font
do
begin
Assign(AFont);
Size := fmmFontSize * 10
div PixelsPerInch;
FontHeight := Abs(Height);
Font.PixelsPerInch := GetDeviceCaps(C.Handle, LOGPIXELSY);
GetObject(
Handle, sizeof(lf), @lf);
lf.lfEscapement := DrawAngle * 10;
lf.lfOrientation := DrawAngle * 10;
lf.lfWidth := 100 * lf.lfHeight
div (fFontWidth);
lf.lfQuality := ANTIALIASED_QUALITY;
NewFont := CreateFontIndirect(lf);
OldFont := SelectObject(C.Handle, NewFont);
end;
end;
Zitat:
Ein SelectObject(
DC, DeinFont) hilft nichts, da dies z.T. vor Operationen mit einem neuen SelectObject() auf das Font Objekt ausgeführt im TCanvas. Die Fontangaben und auch TextExtent/TextWidth/TextHeight Angaben waren bei mir bisher immer korrekt, von daher kann ich deine Angaben nicht nachvollziehen.
100%-korrekt? Bei verschiedenen TrueType-Fonts? Mal mit 'ner Box (BeginPath / EndPath) drumrum probiert? Das stimmt hinten und vorne nicht, besonders wenn mit lfWidth manipuliert wurde! GetTextExtentPoint32 lieferte mir leider die gleiche (falsche) Angabe wie Canvas.TextWidth - hab ich schon "nachprogrammiert"..
(EDIT):
Auf
http://www.codeproject.com/gdi/italicText.asp ist zu sehen, das TextWidth und GetTextExtentPoint32 eben NICHT das gewünschte liefern. Dort wird wie oben beschrieben ein Bitmap erzeugt und dann vermessen - das klingt allerding recht bescheurt..