Benutzerdefinierter Font

Hallo,
ich bins nochmal.
Ich komme über die Klasse Gdip nicht an den Font ran.

Code:
Gdiplus::Font myFont(L"Times New Roman", 16,Gdiplus::FontStyleRegular,Gdiplus::UnitPoint, NULL);
Geht der erste Parameter auch als String oder Character Array?

Jetzt habe ich die Schriften in der Privaten-Schriften Tabelle registriert.
Code:
AddFontResourceEx ( pListEmbeddedFonts->FOTFile, FR_PRIVATE, 0 ) )  // erstellte FontRessource zur Fontsystemtabelle hinzufügen
An den Font vom Typ HFONT komme ich noch ran.
Code:
HFONT hFont = CreateTFTFont(NULL, TestDC, Name, 0, 0, Laufweite);
Dann aber knallts beim konverieren in einen Gdiplus Font.
Code:
Gdiplus::Font myFont(graphics.GetHDC(), hFont);
Und zwar meldet die Klasse GDI+ in der Methode "Font" an der Stelle wo die Methode GdipCreateFontFromLogfontA(hdc, &lf, &font); aufgerufen wird, dass es sich nicht um einen True Type Font handelt. Anschließend wird der Parameter "font" auf 0 gesetzt.
Code:
Font::Font(IN HDC hdc,
           IN const HFONT hfont)
{
    GpFont *font = NULL;

    if (hfont)
    {
        LOGFONTA lf;

        if(GetObjectA(hfont, sizeof(LOGFONTA), &lf))
            lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font);
        else
            lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
    }
    else
    {
        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
    }

    SetNativeFont(font);
}
Gibt es hierfür überhaut eine Lösung?

mfG.
fujitsufan
 
Um was für eine Font handelt es sich denn? Und warum gehst du noch immer den Umweg über ein HFONT-Objekt?
 
Hallo,
es handelt sich um eine Reihe eigener Fonts die ich nicht in der System-Schrift Tabelle, sondern in einer User-Schrift Tabelle haben möchte.
Daher auch die Registrierung mit:
Code:
AddFontResourceEx ( pListEmbeddedFonts->FOTFile, FR_PRIVATE, 0 ) )  // erstellte FontRessource zur Fontsystemtabelle hinzufügen 
An den Font
Den Umweg über den das HFONT Objekt, denn somit kann ich den Font über eine CallBack-Funktion aus der Enumerierung bzw. aus der User-Schrift Tabelle lesen.
Code:
int CALLBACK EnumFontsCallBack(LOGFONT FAR* lplf, NEWTEXTMETRIC FAR* lpntm, int FontType, LPARAM lpData, DWORD dwFalgs)
{
  *((BOOL*)lpData)=FALSE; // Gefunden, dann NICHT embedded => Font ist in Systemtable
  return 0;
}
Wie kann ich denn sonst sicherstellen, dass über die GDI+ Klasse aus der User-Schrift Tabelle gelesen wird.
Code:
Gdiplus::Font constFont(L"Albertus Medium", 16, Gdiplus::FontStyleRegular, Gdiplus::UnitPoint, NULL);
****? Es müsste doch ein Übergabeparameter verfügbar sein um dies zu definieren!?

Ich könnte diese eigenen Schriften auch in der System-Schrift Tabelle registrieren. Es kann dann aber passierten, dass 2 Fonts (vorausgesetzt der Fontname wäre zufällig der gleiche) miteinander kollidieren.

mfG.
fujitsufan
 
Wie gesagt, GDI+ hat dafür die PrivateFontCollection, da kannst du diese hinzufügen via AddFontFile und anschliessend diese PrivateFontCollection an den Konstruktor von Font übergeben.

Mit
Um was für eine Font handelt es sich denn?
meinte ich eher um was für einen Typ von Font es sich handelt. Keine True Type Font?
 
Hallo,
die Registrierung der Schriften in der User-Schriften Tabelle wird in einem anderen Programmteil (nicht GDI+ Klasse) durchgeführt.
Code:
AddFontResourceEx ( pListEmbeddedFonts->FOTFile, FR_PRIVATE, 0 ) )

Bei dem Font handelt es sich um einen True Type Type. Dies habe ich geprüft (kopieren nach C:\Windows\Fonts und Dateinamen anschauen). Oder mit Typograf öffnen.

mfG.
fujitsufan
 
Hallo,
ich bin immer noch nicht am Ziel angekommen.

Meine Frage:

Kann ich die Fonts mit der Methode
Code:
 AddFontResourceEx ( pListEmbeddedFonts->FOTFile, FR_PRIVATE, 0 ) )
in der Privat-Schriften Tabelle registrieren und anschließend in der GDI+ Klasse auslesen:
Code:
Gdiplus::FontFamily fontFam;
int nFound = 0;
if(pfc.GetFamilies(&fontFam, 1, &nFound) != Gdiplus::Ok || nFound != 1)
   ; // error handling
 
Gdiplus::Font myFont(&fontFam, 16);
Oder muss ich die Fonts in der GDI+ Klasse in der Private-Schrift Tabelle registrieren
Code:
Gdiplus::PrivateFontCollection pfc;
if(pfc.AddFontFile(L"C:\\MyFont.ttf") != Gdiplus::Ok)
   ; // error handling
um diese dann anschließend in der GDI+ Klasse auszulesen?

mfG.
fujistufan
 
Es stellt sich natürlich die Frage, warum überhaupt du AddFontResourceEx verwendest wenn du ja für das Erstellen der Font dann GDI+ verwendest welches eigene Funktionalitäten dafür bietet. Und zu deiner Frage:
In einer PrivateFontCollection kannst du nur auf FontFamilies zugreifen, die du via AddFontFile oder AddFontMemResource hinzugeführt hast.
 
Hallo Muepe32,

ganz einfach. Die Software wurde mir größtenteils fertiggestellt übergeben.
In einem Softwareteil wurde die Fontregistrierung via
Code:
AddFontResourceEx ( pListEmbeddedFonts->FOTFile, FR_PRIVATE, 0 ) )
durchgefürt.
In einem anderen Softwarteil wurde eine Applikation eingefügt, die mittels GDI+ Klasse die Grafiken erstellt. Leider lässt sich in dem GDI+ Teil nur Schriften benutzen die den Systemschriften in C:\Windows\Fonts unterliegen. Benötigt werden aber Schriften, die in der Private-Schrift Tabelle registriert sind.

Ich soll das nun richten.

So!
 
Ok, dann würde ich vorschlagen, dass du für Fonts ausschliesslich GDI+ verwendest und somit alles über PrivateFontCollection (ohne AddFontResourceEx) zu regeln. Dann hast du dabei auch keine Probleme wegen Inkompatibilitäten.
 
Zurück