CreateFont



  • Hallo,

    GetLastError gibt mir 1814 zurück.
    Die Schrift lade ich aber vorher (beim start des Programmes) zu den Ressourcen

    if  (!AddFontResource(_T("StorageCard\\MSMINCHO.TTF"))) 
    		AfxMessageBox(_T("AddFontResource Fehler"),0,0);
    

    Die Schrift habe ich auf die Festplatte / Flash des Gerätes kopiert.
    Beim Gerät handelt es sich um CE-Gerät.

    Oli_1977


  • Mod

    1814==Der angegebene Ressourcenname wurde nicht in der Image-Datei gefunden.

    Ich würde mal sagen, dass ist kein gültiger Font!



  • Ich habe GetLastError mal gleich in der InitInstance meiner Anwendung abgefragt.
    Noch bevor ich überhaupt etwas mache. Da bekomme ich auch schon diesen Fehler.
    Wie kann ich dann eine Schrift zur Laufzeit laden und auf ein Steuerelement setzen, um UNICODE-Zeichen auszugeben?

    Oli_1977


  • Mod

    Oli_1977 schrieb:

    Ich habe GetLastError mal gleich in der InitInstance meiner Anwendung abgefragt.

    Das ist doch Unfug. GetLastError hat für Dich nur eine Bedeutung nach einer WinAPI Funktion, die fehlschlägt.
    Das wahlfreie Abfragen von GetLastError ist Unfug und hat keinerlei Aussagekraft.



  • Dann brauche ich nach

    #define FO_BR 	0
    #define FO_ESC 	0
    #define FO_WINKEL 	0
    #define FO_ITAL 	0
    #define FO_UNDERL 	0
    #define FO_STRIKE 	0
    
    if (font.CreateFont(10
    	, FO_BR, FO_ESC, FO_WINKEL,FW_BOLD ,FALSE,FALSE,
    	0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,_T("StorageCard\\MSMINCHO.TTF")) == 0)
    		MessageBox(_T("Error"),_T("Error"));
    

    Dann brauche ich GetLastError nach CreateFont auch nicht überprüfen. Denn laut Doku ist der Rückgabewert von CreateFont gleich 0, wenn sie fehlgeschlagen ist.


  • Mod

    OK! Korrekt. Das habe ich in Deiner ersten Email irgendwie überlesen.

    Dann ist esso, dass der Font-Mapper eben mnit Deinen Angaben einen anderen Font findet.
    Du kannst Dir ja mal die LOGFONF Infos des selektierten Fonts auseben lassen.

    CreateFont erzeugt eine Struktur mit ein paar Infos. Erst wenn Du den Font in einen Kontext selektierst wird ein echter Font zugeordnet, nach einem Best-Fit Verfahren.
    http://msdn.microsoft.com/en-us/library/ms969909.aspx



  • Hallo,

    ich habe mir mal den LOGFONT vom DC geholt.

    LOGFONT lf;
    CFont *ff;
    CDC *dc;
    dc = GetDlgItem(IDC_BUTTON1)->GetDC();
    ff = dc->GetCurrentFont();
    ff->GetLogFont(&lf);
    

    Im LOGFONT unter lfFaceName Tahoma an.
    Er setzt also die falsche Schrift.


  • Mod

    Nein er mapped die Schrift, die am nächsten passt.
    Deine Angaben treffen eben nicht auf diesen Font zu, den Du selektieren willst.



  • Du weißt aber nicht zufällig, welche Einstellung falsch ist?


  • Mod

    Wie sollte ich. Ich kenne Deinen Fotn und die eigenschaften nicht, die Du möchtest.

    In jedem Fall ist es günstiger, weniger Informationen anzugeben, als zu viele.
    Und wie schon gesagt: Dein Fontname ist in jedem Falle mal für die Füsse!

    Aber wir können weiter machen:
    1. height: Bist Du sicher, dass Du 10 meinst und nicht -10
    2. Warum gibst Du FF_SWISS and, besser FF_DONTCARE
    3. Und nochmal: Dein Fontname ist in jedem Falle mal für die Füsse!



  • Habe es mal auf Deine Daten geändert. Ohne Erfolg.

    Die Schrift soll nichts besonderes sein.
    Nicht unterstrichen und nicht dick, ich will nur japanische oder chinesische Zeichen erstmal zum testen ausgeben.



  • Habe das erstellen der Schrift auf folgendes geändert:

    font.CreateFont(-10, FO_BR, FO_ESC, FO_WINKEL,FW_BOLD ,FALSE,FALSE,
    	0,CHINESEBIG5_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE ,_T("MS Mincho"))
    

    Zur Laufzeit setze ich ja die Schrift auf den Button.
    Danhach frage ich noch mal den LOGFONT ab. DIeseer liefert mir immer noch Tahoma.
    Der Text, den ich zur Laufzeit auf den Button setze, wird jetzt aber richtig angezeigt.


  • Mod

    Oli_1977 schrieb:

    LOGFONT lf;
    CFont *ff;
    CDC *dc;
    dc = GetDlgItem(IDC_BUTTON1)->GetDC();
    ff = dc->GetCurrentFont();
    ff->GetLogFont(&lf);
    

    Jetzt habe ich mir Deinen Test erst jetzt genaer angesehen. Der ist natürlich auch Unfug.
    Der DC den Du da bekommst ist temprorär und enthält nicht den Font. Zudem wird er nicht freigegeben.

    - Du müsstest GetFont auf den Button ausführen.
    - Dann einen Test DC erzeugen
    - Font selektieren
    - Dann GetTextFace und GetTextMetrics ausführen.



  • Hallo.

    Ich wollte mich noch bei Dir bedanken für Deine Hilfe, ohne der ich es wohl nicht geschafft hätte.
    Danke.

    Oli_1977


Anmelden zum Antworten