Eigene Fonts in Vista ??



  • Servus,

    ich habe mit:

    HRSRC hRes = FindResource(NULL,MAKEINTRESOURCEA(IDR_MY_FONT), _T("BIN"));
    	PVOID lpFont = LockResource(LoadResource(NULL,hRes));
    	DWORD dwSize = SizeofResource(NULL,hRes), cFonts = 0;
    	hFont=NULL;
    	hFont = AddFontMemResourceEx(lpFont,dwSize,NULL,&cFonts);
    	ASSERT(cFonts > 0);
    

    Einen True Type Font in einem Program mitgeführt. Ich kann nach diesen Routinen
    jederzeit einen CFont kreiren und verwenden.
    Nur unter Vista wird dieser einfach nicht angezeigt.
    Das hFont Handle ist aber nicht NULL -> Font gültig installiert.
    UAC ist aktiv, bei inaktivem UAC klappt es.

    Wieso geht das nicht, was kan man tun ohne das der User als Admin starten soll?
    Mir würde es schon reichen festzustellen, wann es nicht geht, aber dummerweise
    klappt jede Zeile (hFont ist valid). Es wird nur nichts angezeigt.

    Grüße
    TheNoName


  • Mod

    Ich rate mal!
    Vielleicht will AddFontMemResourceEx unter Vistae keinen konstanten Zeiger/Speicher.
    LockResource liefert aber einen Zeiger der in der EXE liegt und in jedem Fall nicht beschrieben werden kann.

    Allokiere mal einen neuen Speicherblock.
    Warum das allerdings ohne UAC klappt ist mir auch ein Rätsel.



  • Hört sich gut an.
    Das es ohne UAC funktioniert hat sich zerschlagen.
    Ich habe mir jetzt "leider" für Test's einen VIsta Rechner hingestellt.
    Da ergab sich, das UAC nicht das Übel ist.

    Es wird so sein, wie du sagst, aber wie meinst du das mit dem allocieren ?

    Speicher allokieren und Resource in Speicher laden ?
    oder gibt es bei den obigen Zeilen einen kurzen Trick zum dazubasteln ?

    Gruß
    SirNoName


  • Mod

    - Größe der Resource ermitteln
    - new oder GobalAloc durchführen,
    - Ressource Daten in neuen Block kopieren.
    - dann AddFontMemResourceEx ausführen,
    - Speicher freigeben.



  • Etwa so ?

    HRSRC hRes = FindResource(NULL,MAKEINTRESOURCEA(IDR_MY_FONT), _T("BIN"));
    	DWORD dwSize = SizeofResource(NULL,hRes), cFonts = 0;
    	HGLOBAL hGlobalFont = GlobalAlloc(GHND, dwSize);
    	PVOID lpFont = GlobalLock(hGlobalFont);
    	memcpy(lpFont, LoadResource(NULL,hRes), dwSize);
    	GlobalUnlock(hGlobalFont); 
    	hFont=NULL;
    	hFont = AddFontMemResourceEx(lpFont,dwSize,NULL,&cFonts);
    	ASSERT(cFonts > 0);
    

    Bringt keinen Unterschied.
    Also unter XP gehts, unter Vista nicht.
    Ich verwende den Font dann später immer mit Namensangabe beim CreateFont. (z.B. "Arial")
    Ist das etwa nicht zulässig in Vista ? muss man hier Gross Kleinschreibung beachten ?


  • Mod

    Ganz sicher, dass die Namen stimmen?
    Der Fontmapper scheint Deinen Font ncht zu finden!
    Welche Eigenschaften hat der Font, wie erzeugst Du ihn?



  • Ok, anderer Ansatz,

    ich erzeuge mit CFont CreateFont den Font und übenehme ihn in ein CDC.
    Unter XP geht alles, unter Vista bekomme ich vom CreatFont keine Fehlermeldung.
    Der Font scheint also valid zu sein.
    Danach wähle ich den Font in ein CDC.
    Kann es sein, das ein CDC unter Vista mit DrawText oder TextOut Schwierigkeiten hat ?

    Gruß
    thenoname


  • Mod

    Nein! Du bekommst evtl. eben nur einen anderen Font. CreateFOnt funktioniert im Prinzip immer. Du bekommst evtl. nur nicht den Font, den Du willst, sondern eben einen naheliegenden.

    Ich kenne keinerlei Problem der UI unter Vista. Aber einige Bugs von XP, die als "will not be fixed" eingestuft wurden.



  • Hallo,

    habe den Fehler nun lokalisiert.
    Vista reagiert etwas empfindlich auf "doppelte" Fonts.
    Wenn man z.B. Arial als Resource einbindet, dann ist diese doppelt bei einer
    solchen Installation. Bei XP kein Problem, bei Vista geht es wohl wie bei Frequenzen: 2 gleiche neutralisieren sich.

    Danke für die Antworten...

    Gruß
    thenoname


Anmelden zum Antworten