2016-03-18 8 views
4

Einige Schriftarten haben nur ein mittleres und ein fettes Gewicht. Mit dem folgenden Code muss ich TFontDialog alle zusammen vermeiden? Bei der Auswahl des Stils Medium aus dem Dialog wird die Gewichtung 500 als Stil BOLD zurückgegeben. Wenn ich diesen Style speichere und TFontDialog wieder öffne, ist er jetzt auf BOLD gesetzt.Wie stelle ich Schriftarten mit mittlerer Schriftgröße mit TFontDialog ein?

FW_THIN = 100; 
    {$EXTERNALSYM FW_EXTRALIGHT} 
    FW_EXTRALIGHT = 200; 
    {$EXTERNALSYM FW_LIGHT} 
    FW_LIGHT = 300; 
    {$EXTERNALSYM FW_NORMAL} 
    FW_NORMAL = 400; 
    {$EXTERNALSYM FW_MEDIUM} 
    FW_MEDIUM = 500; 
    {$EXTERNALSYM FW_SEMIBOLD} 
    FW_SEMIBOLD = 600; 
    {$EXTERNALSYM FW_BOLD} 
    FW_BOLD = 700; 
    {$EXTERNALSYM FW_EXTRABOLD} 
    FW_EXTRABOLD = 800; 
    {$EXTERNALSYM FW_HEAVY} 
    FW_HEAVY = 900; 

    {$EXTERNALSYM FW_REGULAR} 
    FW_REGULAR = FW_NORMAL; 

    procedure TFontDialog.UpdateFromLogFont(const LogFont: TLogFont); 
    var 
     Style: TFontStyles; 
    begin 
     with LogFont do 
     begin 
     Font.Name := LogFont.lfFaceName; 
     Font.Height := LogFont.lfHeight; 
     if FFontCharsetModified then 
      Font.Charset := TFontCharset(LogFont.lfCharSet); 
     Style := []; 
     with LogFont do 
     begin 
      if lfWeight > FW_REGULAR then Include(Style, fsBold); 
      if lfItalic <> 0 then Include(Style, fsItalic); 
      if lfUnderline <> 0 then Include(Style, fsUnderline); 
      if lfStrikeOut <> 0 then Include(Style, fsStrikeOut); 
     end; 
     Font.Style := Style; 
     end; 
    end; 
+0

Entsprechend diesem Code, ja - TFontDialog wird nicht für Sie arbeiten, weil jede Schriftart Gewicht> FW_REGULAR fügt nur 'fsBold' zu den' Font.Style', und keine anderen Schriftartengewichte berücksichtigt werden. Dies würde bedeuten, dass Gewichte <= FW_REGULAR nicht fett und> FW_REGULAR ohne andere Überlegungen wären. –

+0

Beachten Sie, dass dies eine Einschränkung von 'TFontDialog' selbst ist, nicht die zugrunde liegende Win32' ChooseFont() 'API. Die VCL hat kein Konzept eines "mittleren" Stils für Schriftarten, eine Schriftart ist entweder fett oder nicht. –

Antwort

0

Leider ist die TFontDialog, die von der VCL zur Verfügung hat keine Kenntnis davon, noch ist die TFont in Delphi. Die VCL erkennt nur fett oder nicht fett, keine Zwischenschriftgewichte. Sie müssten diese vollständig umgehen und eigene Dialog- und Schriftobjekte implementieren, um diese Funktionalität zu erreichen.

+1

Sie müssten TCanvas wirklich überspringen? Ich würde erwarten, dass Sie Ihre Schriftart erstellen, das Handle einem TFont zuweisen und von dort aus zur VCL zurückkehren können. Tun "TFont" oder "TCanvas" die Schrift "normalisieren", um sie an die VCL-Schrifteigenschaften anzupassen? –

+0

In der Tat Rob, ich erwarte in der Lage sein, 'Canvas.Font.Handle' zu ​​einem von WinAPI bekommen Wert. Solange Sie die Eigenschaft 'Font' nicht ändern, wird dieser Punkt zum Zeichnen verwendet. – NGLN

+0

Das habe ich erwartet, ich habe nur auf eine andere Lösung gehofft. Habe noch nicht ganz herausgefunden, wie die "Font Style" -Optionen ausgefüllt werden. Manchmal hat es mehr Auswahlmöglichkeiten, als der Font.Style erlauben würde. –

Verwandte Themen