Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utiliser la police DEFAULT_GUI_FONT lors de l'affiche d'un texte avec la classe STATIC

6 réponses
Avatar
victor.thuillier
Bonjour,

J'ai une question de d=E9butant. Je cr=E9=E9 une simple chaine =E0 afficher
comme =E7a :

CreateWindow (TEXT ("static"), TEXT ("Hello world !"), WS_CHILD |
WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 1, ((LPCREATESTRUCT) lParam)-
>hInstance, NULL);

lorsque ma proc=E9dure re=E7oit le message WM_CREATE. Le texte est affich=
=E9
avec la police par d=E9faut du syst=E8me. Moi je veux utiliser la police
par d=E9faut pour les applications en GUI (donc utiliser la constante
DEFAULT_GUI_FONT) comme avec TextOut. Comment faire ?

Merci pour toute r=E9ponse.

6 réponses

Avatar
Christian ASTOR
wrote:

J'ai une question de débutant. Je créé une simple chaine à afficher
comme ça :
CreateWindow (TEXT ("static"), TEXT ("Hello world !"), WS_CHILD |
WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 1, ((LPCREATESTRUCT) lParam)->
hInstance, NULL);

lorsque ma procédure reçoit le message WM_CREATE. Le texte est affiché
avec la police par défaut du système. Moi je veux utiliser la police
par défaut pour les applications en GUI (donc utiliser la constante
DEFAULT_GUI_FONT) comme avec TextOut. Comment faire ?



Par ex =>

HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, TRUE);
Avatar
victor.thuillier
Ça ne fonctionne pas. Dans mon WM_CREATE, j'ai ça (ce n'est pas
DEFAULT_GUI_FONT mais ANSI_VAR_FONT que je veux utiliser en fait) :

case WM_CREATE :
hdc = GetDC (hwnd);

hFont = (HFONT) GetStockObject (ANSI_VAR_FONT);
SendMessage (hwnd, WM_SETFONT, (WPARAM) hFont, TRUE);

label = CreateWindow (TEXT ("static"), TEXT ("Hello
world !"), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 1,
((LPCREATESTRUCT) lParam)->hInstance, NULL);

GetTextMetrics (hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = HIWORD (GetDialogBaseUnits());

ReleaseDC (hwnd, hdc);

return 0;

Merci pour toute aide apportée.
Avatar
Christian ASTOR
wrote:

case WM_CREATE :
hdc = GetDC (hwnd);

hFont = (HFONT) GetStockObject (ANSI_VAR_FONT);
SendMessage (hwnd, WM_SETFONT, (WPARAM) hFont, TRUE);

label = CreateWindow (TEXT ("static"), TEXT ("Hello
world !"), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 1,
((LPCREATESTRUCT) lParam)->hInstance, NULL);



Le SendMessage(), c'est au Static control !
Avatar
Sylvain SF
a écrit :
Ça ne fonctionne pas. Dans mon WM_CREATE, j'ai ça (ce n'est pas
DEFAULT_GUI_FONT mais ANSI_VAR_FONT que je veux utiliser en fait) :

case WM_CREATE :
hdc = GetDC (hwnd);

hFont = (HFONT) GetStockObject (ANSI_VAR_FONT);
SendMessage (hwnd, WM_SETFONT, (WPARAM) hFont, TRUE);

label = CreateWindow (TEXT ("static"), TEXT ("Hello
world !"), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 1,
((LPCREATESTRUCT) lParam)->hInstance, NULL);

GetTextMetrics (hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = HIWORD (GetDialogBaseUnits());

ReleaseDC (hwnd, hdc);
return 0;



Christian a dit : "SendMessage(hStatic, WM_SETFONT, ...)

c'est sur le *label* qu'il faut fixer la fonte pas sur le container,
les fontes (comme pas mal d'attributs) ne sont pas hérités entre
parent et childs.

sinon:
- je mettrais des coordonnées non nulles pour le Static,
- le HINSTANCE transmis à CreateWindow ne sert à rien
(sauf avec W98 mais c'est sûrement pas le cas).
- le GetDC, GetTextMetrics, ReleaseDC n'ont rien à faire dans
un WM_CREATE; ils peuvent servir dans le WM_PAINT.

Sylvain.
Avatar
victor.thuillier
> - je mettrais des coordonnées non nulles pour le Static,
- le HINSTANCE transmis à CreateWindow ne sert à rien
   (sauf avec W98 mais c'est sûrement pas le cas).
- le GetDC, GetTextMetrics, ReleaseDC n'ont rien à faire dans
   un WM_CREATE; ils peuvent servir dans le WM_PAINT.

Sylvain.



1) Les coordonnées sont modifiées lors d'un WM_SIZE
2) Ah, je savais pas, mais le texte s'affiche toujours avec cette
vieille police moche
3) Les variables cxChar et cyChar sont statiques, ça m'évite de le
mettre dans un WM_PAINT (leur valeur ne changera pas au cours du
programme)

Le SendMessage(), c'est au Static control !



Désolé, je comprends pas ce que ça veut dire.
Avatar
victor.thuillier
Ah ok, merci, donc avec "label" en premier paramètre de SendMessage et
non "hwnd" (ma fenêtre principale), ça fonctionne bien, merci. :)