Das sollte über den TFont vom TCanvas erschlagen sein. Du weist ja das .Handle zu und die
VCL kümmert sich dann darum, ergo schon richtig wie du das gemacht hast. Ich finde keinen Fehler in deinem Source, mal abgesehen davon das du das explizite Self weglassen könntest. Und eben den Punkt das alle Zeichenroutinen die später auf TForm.Canvas aufsetzen nun mit dem Font der Titelzeile arbeiten.
Gruß Hagen
Delphi-Quellcode:
function TForm1.GetCaptionWidth: integer;
var
Metrics: TNonClientMetrics;
begin
Metrics.cbSize := SizeOf(Metrics);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(Metrics), @Metrics, 0);
Canvas.Font.Handle := CreateFontIndirect(Metrics.lfCaptionFont);
Result := Canvas.TextExtent(Caption).cx;
Canvas.Font.Assign(Font); // originalen Font aus TForm.Font restaurieren
end;