Zitat von
Flocke:
<Offtopic>
Tja, die RTF-Entwickler hätten es damals \ffontfamily nennen sollen und nicht \fcharset.
</Offtopic>
Delphi kümmert sich nur insofern um das Feld
PitchAndFamily, als dass dort VARIABLE_PITCH oder FIXED_PITCH gesetzt wird. Die Schriftfamilie wird ignoriert - und da das Feld bei CreateFontIndirect nicht gefüllt ist, liefert die Abfrage immer den gleichen Wert zurück (0). Dies kannst du in der
Unit Graphics nachlesen (Methode
TFont.GetHandle).
Du könntest dir mit der Funktion
EnumFontFamiliesEx eine interne Liste mit den Schriftfamilien aller installierten Schriften machen (z.B. in einer TStringList) - schau dir mal in der
Unit Forms in der Methode
TScreen.GetFonts an wie Delphi das macht. In der TLogFont-Struktur, die du in der Callback-Routine
EnumFontsProc vom System übergeben bekommst, sollte das Feld PitchAndFamily gefüllt sein.
Ich dachte, GetObject wäre eine Funktion des Windows und würde immer die Windows-Daten liefern.
Schließlich ruft die
Unit Graphics (bevor es CreateFontIndirect aufruft) mit dieser Funktion die Daten ab und belegt von daher seine Daten. Ist es so, dass die Funktion GetObject dann nur noch die Daten liefert, mit denen Graphics den Font durch createFontIndirect kreiert hat?
Ü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
Wie kommt WordPad an diese Daten heran?
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?
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?
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.