AddFontResource ganz übles Problem



  • hi,

    ich lade eine Schrift *.ttf Datei in mein Programm beim starten ein.
    Alles klappt auch wunderbar, aber nur solange man das Programm
    nicht über den Taskmanger abschießt oder es beendent ohne das mein Programm
    noch die Möglichkeit hat die eingeladene Resource zu entfernen.

    Wenn man in dem Fall das Programm erneut startet funktioniert die geschichte mit der Schriftdatei nicht mehr.
    Auch anderen Programme (Paint, Word etc) können mir dann keine Auswahl der Schrift mehr anzeigen.

    Kann man denn da was machen ? hier mein bescheidener Code

    WideString TTfDatei = "C:\\myfont.ttf";
    
    //Font laden
    void __fastcall TForm1::::FormShow(TObject *Sender)
    {
            AddFontResourceW(TTfDatei);
            SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
    
            Memobox->Font->Name = "AClassic";
    }
    
    //font entfernen
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
            RemoveFontResourceW(TTfDatei);
            SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    }
    


  • Leider liefert die AddFontResource Funktionen keinen Grund für einen Fehlschlag zurück...
    Was passiert denn, wenn du vor dem AddFontResource Aufruf RemoveFontResource aufrufst?



  • Dann passiert nix und die macke bei der Fontauswahl über Paint, Word etc. bleibt und ist nicht mehr benutzbar. was man alles anrichten kann ?:)

    Ich habe das jetzt anders gemacht dabei lade ich aus ner resourcefile *.RES
    meinen Font und verwende dann die Funktion AddFontMemResourceEx.
    Dabei erscheint mein Font nicht in der Fontauswahl der Programme (ob das so seine Richtigkeit hat weiss ich nicht)
    aber so funktioniert das wie ich es wollte und ein Programm-Abschuss führt nicht mehr zu den erwähnten problemen.

    struct TFontResBuffer
    {
            PChar Buf;
            THandle FontHandle;
            int Size;
    };
    
    bool AddFontFromRes(const PChar ResName, struct TFontResBuffer FontResBuffer)
    {
            TResourceStream *Res;
            DWord ResFontCount;
    
            try
            {
                    Res = new TResourceStream((unsigned)HInstance, ResName, "RT_FONT");
                    FontResBuffer.Size = Res->Size + 1;
                    FontResBuffer.Buf = (char*) AllocMem(FontResBuffer.Size); //Speicher aufn heap;
                    Res->Read(FontResBuffer.Buf, FontResBuffer.Size);
                    //Res->SaveToFile("test.ttf");
            }
            __finally
            {
                    delete Res;
            }
    
            ResFontCount = 1;
            FontResBuffer.FontHandle = (THandle) AddFontMemResourceEx(FontResBuffer.Buf, FontResBuffer.Size, 0, &ResFontCount);
    
            if(FontResBuffer.FontHandle != NULL)
            {
                    SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
                    return true;
            }
            else
            {
                    //FreeMemory(FontResBuffer.Buf);
                    return false;
            }
    }
    
    bool DeleteFontFromRes(struct TFontResBuffer FontResBuffer)
    {
            FreeMemory(FontResBuffer.Buf);      
            if(RemoveFontMemResourceEx((THandle*) FontResBuffer.FontHandle))
            {
                    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
                    return true;
            }
            else
                    return false;
    }
    
    //Schrift einladen aus resource (*RES)
    TFontResBuffer FontResBuffer;
    AddFontFromRes("font", FontResBuffer); //font = id in der *rc File
    Memo1->Font->Name = "ArialMod";        //Name der Schrift
    
    //Schrift killen
    DeleteFontFromRes(FontResBuffer);
    


  • hi,

    hatte noch nen Fehler drin in den Funktionsköpfen die müssen anders declariert werden, hier jetzt die richtigen.

    bool AddFontFromRes(const PChar ResName, struct TFontResBuffer &FontResBuffer);
    bool DeleteFontFromRes(struct TFontResBuffer &FontResBuffer);
    

Anmelden zum Antworten