Modifier la police de fenêtre par défaut dans un projet Windows Win32

Je crée une application graphique utilisant C et Win32 api. Je voudrais savoir comment nous pouvons changer la police par défaut de la fenêtre principale en thaoma. Je viens de fond .NET. Dans .NET, si nous modifions la police du contrôle parent, les contrôles enfants héritent alors automatiquement de cette police …. Existe-t-il un modèle similaire ou devons-nous définir manuellement la police de chaque contrôle …..

Considérons le code suivant …

#include  #define ID_EDIT 1 #define ID_BUTTON 2 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit; static HWND hwndButton; static int len; static TCHAR text[30]; switch(msg) { case WM_CREATE: hwndEdit = CreateWindow(TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 20, hwnd, (HMENU) ID_EDIT, NULL, NULL); hwndButton = CreateWindow( TEXT("button"), TEXT("Set Title"), WS_VISIBLE | WS_CHILD, 50, 100, 80, 25, hwnd, (HMENU) ID_BUTTON, NULL, NULL); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, msg, wParam, lParam); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg ; WNDCLASS wc = {0}; wc.lpszClassName = TEXT( "Edit Control" ); wc.hInstance = hInstance ; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc ; wc.hCursor = LoadCursor(0,IDC_ARROW); RegisterClass(&wc); CreateWindow( wc.lpszClassName, TEXT("Edit control"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 220, 220, 280, 200, 0, 0, hInstance, 0); while( GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } 

Comment puis-je changer la police du bouton, zone de texte dans le programme ci-dessus ..

Aidez-moi s’il vous plaît ici ……. et laissez-moi savoir le processus général suivi lors du codage dans l’API Win32 ….

Merci d’avance..

Vous pouvez définir la police d’une fenêtre en lui envoyant le message WM_SETFONT :

 HWND myButton = CreateWindowEx(/* ... */); HFONT myFont = /* ... load font from somewhere ... */ /* Change the button font. */ SendMessage(myButton, WM_SETFONT, WPARAM(myFont), TRUE); 

Cette approche vous permet de contrôler, contrôle par contrôle, les fonts que vous utilisez, mais vous ne devez le faire qu’une fois par fenêtre.

Vous essayez probablement de créer une application graphique basée sur un dialog, qui ressemble un peu à une application basée sur un formulaire dans .NET. Vous pouvez définir une police pour le formulaire et tous ses contrôles enfants hériteront de cette police. Une situation proche existe également dans chaque dialog.

Pour créer une boîte de dialog dans le respect de l’API Win32, vous pouvez lire ici: http://msdn.microsoft.com/en-us/library/ms644996%28VS.85%29.aspx . La différence principale entre la programmation des dialogs et la création de formulaires est que vous devez utiliser un éditeur de ressources (à l’intérieur de Visual Studio ou du SDK Windows, par exemple) pour concevoir des dialogs. Les résultats seront enregistrés dans un fichier RC (fichier de ressources pas encore compilé). Les résultats seront les suivants:

 IDD_ABOUTBOX DIALOGEX 0, 0, 205, 98 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About" FONT 8, "MS Shell Dlg 2", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,77,77,50,14 LTEXT "Trust to User (T2U) v1.0\n\n(c) Copyright 2003, 2004", IDC_STATIC,72,32,120,32 ICON IDR_MAINFRAME,IDC_STATIC,25,27,20,20 GROUPBOX "",IDC_STATIC,7,3,191,69 LTEXT "OK soft GmbH",IDC_OK_SOFT_GMBH,72,16,120,8 END 

vous pouvez avoir plusieurs ressources en une seule langue dans différentes langues enregistrées dans le même fichier RC:

 IDD_ABOUTBOX DIALOGEX 0, 0, 205, 98 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "バージョンの情報" FONT 8, "MS Shell Dlg 2", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,77,77,50,14 LTEXT "Trust to User (T2U) v1.0\n\n(c) Copyright 2003, 2004", IDC_STATIC,72,32,120,32 ICON IDR_MAINFRAME,IDC_STATIC,25,27,20,20 GROUPBOX "",IDC_STATIC,7,3,191,69 LTEXT "OK soft GmbH",IDC_OK_SOFT_GMBH,72,16,120,8 END 

Vous obtiendrez les meilleurs résultats en cas d’internationalisation si vous utiliserez “MS Shell Dlg 2” ou “MS Shell Dlg” à la place de la police de caractères “Tahoma”, mais l’utilisation directe de “Tahoma” est également possible:

 FONT 8, "Tahoma" 

Vous devez utiliser “MS Shell Dlg 2” avec l’indicateur DS_SHELLFONT ou une combinaison de DS_FIXEDSYS et DS_SETFONT (voir http://blogs.msdn.com/oldnewthing/archive/2005/02/07/368423.aspx ) qui suit. utilisation de “Tahoma” sur la plupart des ordinateurs (vérifiez la valeur “MS Shell Dlg 2” sous la clé de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes ). Lisez http://msdn.microsoft.com/en-us/library/dd374112%28v=VS.85%29.aspx ou http://support.microsoft.com/kb/282187/fr à ce sujet.

En passant, vous pouvez ouvrir une ressource enregistrée dans un fichier EXE, DLL ou EXE.MUI / DLL.MUI dans le respect de Visual Studio. Vous devez simplement ouvrir le fichier et choisir “Ouvrir avec” et choisir “Éditeur de ressources”. Sous Windows 7, vous pouvez rechercher C:\Windows\winsxs\x86_microsoft-windows-notepad et l’ouvrir comme un fichier tel que C:\Windows\winsxs\x86_microsoft-windows-notepad.resources_31bf3856ad364e35_6.1.7600.16385_en-us_1dbc2e35304db501\notepad.exe.mui . Ensuite, vous pouvez enregistrer le fichier sous le nom notepad.rc , puis ouvrir le fichier notepad.rc dans un éditeur de texte et vous trouverez les fragments suivants.

 15 DIALOGEX 30, 17, 300, 22 STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "&Encoding:",259,68,1,40,40,NOT WS_GROUP COMBOBOX 257,130,0,164,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP END 51200 DIALOGEX 0, 0, 324, 140 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_CAPTION CAPTION "Software Licensing" FONT 9, "Segoe UI", 0, 0, 0x0 BEGIN LTEXT "To use this feature without interruption, this computer needs to be running genuine Windows.",-1,0,10,250,20 LTEXT "With genuine Windows you have access to all Windows updates and can be confident that your Windows software has the latest security and reliability enhancements from Microsoft.",-1,0,35,250,30 CONTROL 51209,-1,"Static",SS_BITMAP,260,10,100,55 CONTROL "&Resolve online now",51201,"Button",BS_COMMANDLINK | BS_LEFT | WS_TABSTOP,0,75,250,24 CONTROL "Read the privacy statement online",51202,"SysLink",WS_TABSTOP,0,128,120,10 END 

MISE À JOUR : Essayez de modifier votre fonction WndProc comme suit:

 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit; static HWND hwndButton; static int len; static TCHAR text[30]; HFONT hFont; LOGFONT lf; switch(msg) { case WM_CREATE: hwndEdit = CreateWindow(TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 20, hwnd, (HMENU) ID_EDIT, NULL, NULL); GetObject (GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf); hFont = CreateFont (lf.lfHeight, lf.lfWidth, lf.lfEscapement, lf.lfOrientation, lf.lfWeight, lf.lfItalic, lf.lfUnderline, lf.lfSsortingkeOut, lf.lfCharSet, lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality, lf.lfPitchAndFamily, lf.lfFaceName); SendMessage (hwndEdit, WM_SETFONT, (WPARAM)hFont, TRUE); hwndButton = CreateWindow( TEXT("button"), TEXT("Set Title"), WS_VISIBLE | WS_CHILD, 50, 100, 80, 25, hwnd, (HMENU) ID_BUTTON, NULL, NULL); SendMessage (hwndButton, WM_SETFONT, (WPARAM)hFont, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, msg, wParam, lParam); }