Eigene Font bei CreateFont



  • Hallo,
    ich möchte mit Createfont und Textout Texte bei WM_PAINT schreiben.
    Das klappt auch eigentlich ganz gut, nur scheint irgendwie die Auswahl der Fonts sehr begrenzt zu sein.

    Ich gucke in meinen Fonts-Ordner, merke mir eine Font, gebe diese als letzten Parameter bei Createfont ein, aber dann wird nicht zu dieser gewechselt, sondern es bleibt bei der alten (Hätte ich keine alte spezifiziert, denke ich, dass dann gar nichts passieren würde)

    Auf jeden Fall dachte ich mir dann, dass ich eigene Fonts benutze, nur weiß ich nicht wie...
    Muss ich die als Resource hinzufügen und dann bei CreateFont "MAKEINTRESOURCE(IDF_FONT)" oder irgendwie so etwas schreiben?
    Ich hoffe, dass mir jemand bei dem Problem weiterhelfen kann, danke 🙂



  • Wenn du einen eigenen Font ansprechen willst (der nicht im System-Fonts-Ordner liegt), dann mußt du "AddFontResource" aufrufen (und am Ende deines Programms entsprechend "RemoveFontResource").



  • Wobei "AddFontResource" eigentlich nur noch für Win9x Programme benötigt wird, für Programme ab Win2k empfiehlt sich "AddFontMemResourceEx" da hier die Datei nicht auf Festplatte geschrieben werden muss. Weiterhin ist die Schrift auch nicht in der Schriftauswahl anderer Programme verfügbar, sondern nur dein Proggy ist berechtigt sie zu nutzen. Du kannst dir z.B mit FontCreator eine Schrift selbern erstellen oder eine vorhandene Schriftdatei irgendwohin kopieren und diese dann bearbeiten. Die Datei dann einfach als Resource in den Programm einbauen und mit compilieren.



  • AddFontMemResourceEx kann ich bei mir gar nicht benutzen...

    error LNK2001: Nichtaufgeloestes externes Symbol _AddFontMemResourceEx
    fatal error LNK1120: 1 unaufgeloeste externe Verweise

    Außerdem weiß ich gar nicht, wie genau die Parameter aussehen soll..
    Muss der erst aus MAKEINTRESOURCE und z.B.: IDR_FONT bestehen?
    Und welchen Wert soll der letzte haben? 😕



  • *push* 😞



  • Du mußt auf jeden Fall die Library "gdi32.lib" mitlinken.
    Und die Parameter der Funktion suchst du dir am besten aus der MSDN-Doku raus.



  • guggst du da:

    http://msdn2.microsoft.com/en-us/library/ms533942.aspx

    hier ein bsp code:

    HFONT		my_font;
    
    boolean My_LoadFontResource(void){
    
    	HRSRC		ResourceInfo;
    	DWORD		ResourceSize;
    	HGLOBAL	ResourceHandle;
    	LPVOID		*ResourceData;
    	DWORD		nFont;
    
    	ResourceInfo = FindResource(NULL, MAKEINTRESOURCE(MY_FONT), "SCHRIFT");
    	if(!ResourceInfo){
    		return FALSE;
    	}
    	ResourceSize = SizeofResource(NULL, ResourceInfo);
    	ResourceHandle = LoadResource(NULL, ResourceInfo);
    	ResourceData = LockResource(ResourceHandle);
    	my_font = AddFontMemResourceEx(ResourceData, ResourceSize, 0, &nFont);
    	return my_font;
    }
    


  • Hey cool, danke für den Bsp-Code ^^

    @Linken:
    Ich hatte die aber gelinkt..
    Und windows.h auch inkludiert..

    Dann habe ich die geöffnet, darin wurde dann die gdi-Header-Datei inkludiert, welche ich auch auf gemacht habe und darin wurde die Funktion deklariert, trotzdem kann ich die nicht nutzen..



  • Könnte vielleicht einer freundlicherweise ein Bsp-Projekt machen und das hochladen?
    Das wäre echt nett!
    Danke 🙂



  • Woran kann es denn noch liegen..?
    Die lib habe ich gelinkt und windows.h habe ich inkludiert..



  • Ich habe mal das Code::Blocks benutzt und da funktioniert es..
    Nun habe ich also die Font, aber wie kann ich die jetzt mit Createfont benutzen?
    Ich habe die mal mit dem Windows-Programme geöffnet und mir den Namen gemerkt, diesen dann bei Createfont eingegeben, aber das hat nicht funktioniert..



  • *push*?



  • *pushpush*?



  • Wie sieht denn dein Code aus? Hast du denn AddFontResource bzw. AddFontMemResourceEx vor dem Aufruf von CreateFont benutzt?



  • Ja.
    Der Code ist einfach nur der Bsp-Code.
    Eine Font ge'addet' und den Namen der Font dann in CreateFont benutzt 😕



  • aber das hat nicht funktioniert..

    Und was genau funktioniert jetzt nicht? Was hast du denn mit dem Font dann gemacht? Muß man dir alles aus der Nase ziehen? Ich muß mir wohl doch wieder eine Glaskugel zulegen -)



  • /*FONT-LOAD FUNKTION*/
    HFONT my_font;
    BOOL My_LoadFontResource(void) {
    HRSRC ResourceInfo;
    DWORD ResourceSize;
    HGLOBAL ResourceHandle;
    LPVOID *ResourceData;
    DWORD nFont;
    ResourceInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_FONT1), MAKEINTRESOURCE(8));
    if(!ResourceInfo) {
    MessageBox(NULL, "Nicht gefunden", 0, 0);
    return FALSE;
    }
    else {
    MsgBox(NULL, "Gefunden!", 0, 0);
    ResourceSize = SizeofResource(NULL, ResourceInfo);
    ResourceHandle = LoadResource(NULL, ResourceInfo);
    ResourceData = LockResource(ResourceHandle);
    my_font = AddFontMemResourceEx(ResourceData, ResourceSize, 0, &nFont);
    return my_font;
    }
    
    /*FONT BENUTZEN*/
    
    if(My_LoadFontResource()) {
    MessageBox(NULL, "gut",0,0);
    SelectObject(hDC(), My_LoadFontResource());
    }
    
    /*ODER*/
    
    SelectObject(hDC, CreateFont(12, 0, 0, 0, 0, 0, 0, 0, OEM_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "FONTNAME"));
    

    So habe ich das, und beide Font-Benutzen-Methoden haben nicht funktioniert 😕



  • Und dann schreibe ich etwas mit TextOut.
    Das Ergebnis ist das gleiche, wie wenn ich bei dem Namen der Font in CreateFont einen leeren String angebe..
    Irgend so eine Standard Font..



  • Jetzt habe ich doch den benutzten Code gepostet 😕



  • Irgendeiner muss doch wissen, wie das funktioniert 😞


Log in to reply