[AddFontMemResourceEx] Jeder Speicher gut genug ??



  • Wie die Überschrift schon sagt, will ich über die Funktion eine Schriftart temporär registrieren. Ich implementiere das so:

    void* Mem = new unsigned char[Size]; // lese das Ding aus einer Datei aus (besteht nicht nur aus der .ttf)
    
    if (!Read(...))   // fread-wrapper (ja ich verwende hier eine C-Funktion)
     return Res;
    
    DWORD Num = 0;
    if (!Mem)
       return 0;
    
    HANDLE ret = AddFontMemResourceEx(Mem,Size,0,&Num); // installieren
    
    if (ret != NULL && Num == 1) // Finde heraus obs klappt
       Res = true;
    
    delete[] Mem;
    
    return Res;
    

    Der Speicher wird eingelesen, die Win32-Funktion gibt positive Werte zurück.
    Wenn ich via CreateFont ein Handle erstelle und es einem Control zuweise, kann ich mit GetObject erkennen, dass es SEHR wohl die Schriftart erkennt (da in der LOGFONT der Name der Schrift steht).
    Trotzalledem scheint Windows nichts damit anzufangen zu wissen, da die Arial (System Standard) angezeigt wird.

    Heißt das jetzt ich kann nur Resource hier einbinden (so wie in den Beispiele die man per google findet)? Wenn ja, warum gibt die Funktion dann ein HANDLE zurück?

    Die Funktion im MSDN:
    http://msdn.microsoft.com/en-us/library/dd183325%28v=vs.85%29.aspx



  • Kann als Gelöst betrachtet werden, die Funktionen arbeiten einwandfrei.
    Danke trotzdem für die vielen Aufrufe!

    HINWEIS: GetObject gibt keine Informationen über die Schriftart aus (z.b. ob sie auch tatsächlich auf dem System vorhanden ist), sondern nur mit welchen Parametern das HFONT-Handle erstellt worden ist

    Mein Problem lag hier:

    HFONT --> void* --> <C-Cast> --> HFONT = FAIL!

    Keine Ahnung wieso es hier ein Problem gibt (ja es ist ein C-cast, aber der macht einiges leichter).

    // in der Klasse die die Datei ausliest und die Schrift installiert
    
    void* CreateFontHandle(int Size)
    {
         return CreateFont(size,0,...., FontName);  // 
    }
    
    // dann in meiner Helper-Funktion für ein Edit-Control:
    
    edt = CreateEdit(parent,X,Y,CX,CY,ID,(HFONT)CreateFontHandle(25)); // <--- HIER
    


  • Der Code den du gepostet hast muss aber wenn ich nicht gerade total blind bin korrekt funktionieren.

    HFONT ist entweder (STRICT definiert) ein Typedef auf einen Zeiger auf eine Dummy-Struct (namens HFONT__). Oder (ohne STRICT) ein Typedef auf HANDLE was wiederum ein Typedef auf void* ist.

    Ohne STRICT gibt es hier also überhaupt keine Änderung des Typs, da es der Typ ja immer void* ist. Und ein C-Cast von void* auf void* verändert den Wert auch garantierterweise nicht.

    Mit STRICT wird ein "HFONT__" in CreateFontHandle() implizit zu "void" konvertiert, und danach explizit wieder zurück zu "HFONT__". Und auch dabei ist garantiert dass das Ergebnis genau dem entspricht mit was man angefangen hat, also dem ürsprünglichen "HFONT__".

    Ich vermute also dass das Problem etwas anderes war, was du vielleicht gleichzeitig mit der void*/HFONT Umstellung geändert hast.



  • OK, habs endlich herausgefunden, unglaublich was man bei komplexeren Programmen alles übersehen kann..., vor allem wenn was nicht funktioniert und man daran herumbastelt.

    CreateFont(size,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Fontname.ttf");
    
    // RICHTIG: Den NAMEN der Schriftart nicht die DATEI --> "Fontname" im letzten Parameter
    //KORRIGIERT:
    CreateFont(size,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Fontname");
    

Anmelden zum Antworten