Font-Probleme... ich raff es einfach nicht
-
Wo bzw. wann muss ich die Message denn senden?
Für dauerhafte Umstellung einfach direkt nach CreateWindow.
Achso, was ist den OL bei dir?
Nicht OL, sondern "Null"L
-
Ich glaube ich hatte die ganze Zeit ein Definitionsproblem...
Der Sytle "System Font" steht für MS Sans Serif, nicht wahr? Ich wollte eigentlich den Font auslesen, den der User unter Anzeige->Darstellung eingestellt hat. Also "SystemFont" <> "User-defined Font"! Ist das richtig?
Wie bekomme ich denn statt des SystemFont den Font Tahoma au fas Label?
-
Also nochmal deutlicher:
Wenn ich zum Beispiel eine Installation via msiexec im UI Modus starte, dann verändert sich die Schriftarte je nach dem, welche Schriftart ich gerade eingestellt habe. Dieses Verhalten würde ich gerne für meine Anwendung implementieren, verzweifle aber daran....
Das muss doch sicherlich zu machen sein, oder?
-
Machbar ist alles, aber Font-Handling erfordert etwas Einarbeitung. Vielleicht hilft Dir das hier weiter:
http://msdn.microsoft.com/library/en-us/gdi/fontext_3r77.asp
Es gibt für GetStockObject übrigens auch den Parameter DEFAULT_GUI_FONT, der wird aber vermutlich auch nur den Standard-Font liefern, nicht den vom Benutzer gewählten.
-
An einen bestimmten benutzereingestellten Font, z.B. Menu-Font, MessageBox-Font, usw, kommt man mit der Funktion SystemParametersInfo(). Mit dieser Funktion kann man eine Struktur des Typs NONCLIENTMETRICS mit den gesuchten Font-Daten füllen lassen. Beispiel:
[code]
static HFONT hFont; // static, damit der Font nicht bei jedem WM_PAINT neu erzeugt werden muss
switch(message)
{
case WM_CREATE:
LOGFONT lf;
NONCLIENTMETRICS ncm = {sizeof(NONCLIENTMETRICS)};// Font-Daten vom System holen
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), (void*)&ncm, FALSE);
// MessageBox-Fontdaten in unser eigenes LOGFONT kopieren
lf = ncm.lfMessageFont;
// Font erzeugen
hFont = CreateFontIndirect(&lf);break;
case WM_PAINT:
// Hier den hFont selektieren, zeichnen, de-selektieren
...
break;case WM_DESTROY:
-
Sorry, bin zu früh auf den Sende-Button gekommen. Also hier nochmal

An einen bestimmten benutzereingestellten Font, z.B. Menu-Font, MessageBox-Font, usw, kommt man mit der Funktion SystemParametersInfo(). Mit dieser Funktion kann man eine Struktur des Typs NONCLIENTMETRICS mit den gesuchten Font-Daten füllen lassen. Beispiel:
static HFONT hFont; // static, damit der Font nicht bei jedem WM_PAINT neu erzeugt werden muss switch(message) { case WM_CREATE: LOGFONT lf; NONCLIENTMETRICS ncm = {sizeof(NONCLIENTMETRICS)}; // Font-Daten vom System holen SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),(void*)&ncm, FALSE); // MessageBox-Fontdaten in unser eigenes LOGFONT kopieren lf = ncm.lfMessageFont; // Font erzeugen hFont = CreateFontIndirect(&lf); break; case WM_PAINT: // Hier den hFont selektieren, zeichnen, de-selektieren ... break; case WM_DESTROY: DeleteObject(hFont); .... break; }
-
Danke für die letzten beiden Hilfen, ich werde sie mir mal über WE reintun und am Montag auf der Arbeit schauen, was es bringt... habe mich jetzt gerade ein bisserl durchgearbeitet durch die Beispiele und eine Frage habe ich noch zu Walter Z:
Die Funktion SystemParametersInfo ist in der Tat, das was cih gesucht habe. Soll ich dann eigentlich mittels HDC und DrwaText den Text aufs Fenster bringen, oder lieber per SendMessage(hwnd,WM_SETTEXT...)?
Ich hätte echt nicht gedacht, das Fonthandling mit der WinAPI so viele Parameter verlangt...
-
So, ich nochmal. Ich habe es jetzt folgendermaßen umgesetzt:
case WM_CREATE: { LOGFONT lf; NONCLIENTMETRICS ncm = {sizeof(NONCLIENTMETRICS)}; // Font-Daten vom System holen if(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),(void*)&ncm, FALSE) == 0){ MessageBox(NULL, "Window Font Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); } // MessageBox-Fontdaten in unser eigenes LOGFONT kopieren lf = ncm.lfStatusFont; // Font erzeugen hFont = CreateFontIndirect(&lf); ...Und die Paint-Methode:
case WM_PAINT: hdc = BeginPaint (hWnd, &ps) ; rectangle->left = 15; rectangle->top = 10; rectangle->right = 337; rectangle->bottom = 45; SendMessage(hWnd,WM_SETFONT,(WPARAM)hFont,true); DrawText (hdc, TEXT ("Select the language for this installation from the choices below:"), -1, rectangle,DT_LEFT | DT_WORDBREAK) ; EndPaint (hWnd, &ps) ; ...HFONT hFont ist static und global.
Ich dachte eigentlich, dass ich jetzt die Schriftart meiner Statusleiste zu sehen bekomme, aber mitnichten... was mache ich da bloß falsch?
-
Keiner mehr Lust?
-
Wenn Du mit SendMessage arbeitest, dann würde ich den Zeitpunkt nach dem Create des Fensters empfehlen.
Im Paint solltest Du lieber das verwenden:
HANDLE hFont ;
hFont = SelectObject(hdc, hMyFont) ;Aber nicht vergessen, Du musst das wieder rückgängig machen
SelectObject(hdc, hFont);Gruß André
-
Super danke, das funktioniert jetzt bestens...
Hat jemand vielleicht einen Tipp, wie man zB Tahoma als Standardfont auswählen kann?
Ich habe zwar das Buch von Petzold über die Win32-Programmierung hier, aber ich finde das schrecklich. Ich denke, dass es mit den EnumFontx-Functions zu tun haben wird, oder?
Wäre über einen Tipp, Link, Verweis auf Tutorial diesbezüglich wirklich dankbar