Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Ermittlung der Schriftfamilie

  Alt 25. Apr 2009, 14:32
Zitat von mani64:
Ist es so, dass die Funktion GetObject dann nur noch die Daten liefert, mit denen Graphics den Font durch createFontIndirect kreiert hat?
Ich denke ja. Anders könnte es aussehen mit GetTextMetrics - probiere das doch mal. Dazu musst die die Schrift aber in einen DC selektieren.

Zitat von mani64:
Übrigens: In RTF gibt es eben beides: family und charset, und ich möchte gerne beides angeben.
Wenn ich einen Text in Wordpad schreibe und im RTF-Format speichere dann steht da z.B.
f0\froman\fcharset0 Times New Roman oder
f2\fswiss\fcharset0 Arial oder
f3\fnil\fcharset2 Symbol
Du hast Recht. Ich nehme meine Kritik über die RTF-Entwickler hiermit zurück.

Zitat von mani64:
Wie kommt WordPad an diese Daten heran?
WordPad gar nicht, das muss schon das RichEdit-Control erledigen, da das den RTF-Code erzeugt.

Zitat von mani64:
Kann ich also mit GetObject gar nicht die ursprünglich (vom Erfinder des Fonts) vorgesehenen Daten abrufen? Muss ich den indirekten Weg über EnumFontFamiliesEx gehen? Und stehen nach Aufruf dieser Funktion in LogFont andere Daten, d.h. die, die ich brauche?
Probiere es aus, der Code sieht dann etwa so aus:
Delphi-Quellcode:
function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
  FontType: Integer; Data: Pointer): Integer; stdcall;
var
  S: TStrings;
  Temp: string;
begin
  S := TStrings(Data);
  Temp := LogFont.lfFaceName;
  if (S.Count = 0) or (AnsiCompareText(S[S.Count-1], Temp) <> 0) then
    S.AddObject(Temp, Pointer(MakeLong(LogFont.lfPitchAndFamily, LogFont.lfCharSet)));
  Result := 1;
end;

function GetFonts: TStrings;
var
  DC: HDC;
  LFont: TLogFont;
begin
  Result := TStringList.Create;
  DC := GetDC(0);
  try
    FillChar(LFont, sizeof(LFont), 0);
    LFont.lfCharset := DEFAULT_CHARSET;
    EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, LongInt(Result), 0);
    TStringList(Result).Sorted := true;
  finally
    ReleaseDC(0, DC);
  end;
end;
Natürlich solltest du GetFonts nur einmal aufrufen und dir das Ergebnis merken.
Die Abfrage geht dann über den Namen:
Delphi-Quellcode:
function GetFontInfo(const Name: string; Fonts: TStrings): LongInt;
var
  k: Integer;
begin
  k := Fonts.IndexOf(Name);
  if k < 0 then
    Result := MakeWord(DEFAULT_PITCH or FF_DONTCARE, DEFAULT_CHARSET);
  else
    Result := LowWord(LongInt(Fonts.Objects[k]));
end;

function GetFontFamily(const Name: string; Fonts: TStrings): Byte;
begin
  Result := Byte(LoWord(GetFontInfo(Name, Fonts)) and $00f0);
end;

function GetFontCharSet(const Name: string; Fonts: TStrings): Byte;
begin
  Result := Byte(HiWord(GetFontInfo(Name, Fonts)) and $00ff);
end;
Zitat von mani64:
Es gibt auch noch die Funktion ChooseFont (Win32 Developer's References), die eine eigene Dialogbox liefert. Dort kann man mit WM_ChooseFont_GetLogFont die Daten abrufen. Aber das verstehe ich alles nicht so ganz.
Stellt Windows selbst diese Dialogbox zur Verfügung? Sind das also Aufrufe, die Delphi direkt an Windows weiterleitet? Oder ist das Ganze in Delphi-Dlls oder Units integriert und wird dort bearbeitet?
Und es gibt noch die Funktion GetTextMetrics, die ebenfalls die Daten PitchandFamily zurück liefern soll, aber das nutzt mir ja auch nichts, wenn Delphi bei CreateFontIndirect keine Familie einträgt, oder?
Leider stimmt das.

Zitat von mani64:
Ich habe gerade mal das Delphi-Demoprogramm zu Richedit getestet. Dort steht im Header als Familie immer \fnil! Also dieses Programm ist auch nicht in der Lage, die Familie zu bestimmen und im RTF-Header einzutragen. Allerdings den charset gibt es "richtig" an, bei Symbol z.B. 2. Wenn ich Label7 die Schriftart Symbol zuweise, dann bleibt Font.charset aber bei 0, obwohl im Label die Schrift genauso aussieht, wie sie soll.
Das könnte mit der Version des RichEdit zusammenhängen. Das VCL-RichEdit-Control benutzt IMO noch die 1.0er-Version. Probiere mal ein TJvRichEdit.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat