CreateFont
-
Hallo,
ich habe eine Dialog mit einer UNICODE-Schrit erstellt.
Gebe ich einen Text japanischen TExtauf das Steuerelement aus, funktioniert dies.
Setze ich zur Laufzeit einen andere Schrift auf das Steuerelement, funktioniert dies nicht mehr. Die Schrift, die ich zur LAufzeit setze ist die gleiche die ich in der Entwicklungsumgebung setze.Die Schrift erzeuge ich wied folgt:
#define FO_BR 0 #define FO_ESC 0 #define FO_WINKEL 0 #define FO_ITAL 0 #define FO_UNDERL 0 #define FO_STRIKE 0 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"));Beim debuggen, bekomme ich als Rückgabewert != 0 von CreateFont.
Ist irgendwas an den Übergabeparamtern für CreateFont falsch?Oli_1977
-
Was sucht der komische Dateiname als Facename da drin?
Der Facename ist der Name des Fonts (z.B. Arial) und nicht der Datei in der der Font gespeichert ist!
-
Hallo,
habe den Facenamen auf MS Mincho geändert.
Hat aber nichts geändert.Oli_1977
-
Und existiert dieser Font wirklich?
Was sagt GetLastError?
-
Hallo,
GetLastError gibt mir 1814 zurück.
Die Schrift lade ich aber vorher (beim start des Programmes) zu den Ressourcenif (!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
-
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
-
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.
-
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.
-
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?
-
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.
-
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