OVH Cloud OVH Cloud

WndProc

2 réponses
Avatar
Frédéri MIAILLE
Bonjour.
Dans mon WndProc, je ne comprend pas tout.
J'ai mis des commentaires et je souhaiterai savoir s'ils sont mauvais.
Aussi, mettre un break pour le "case WM_SYSCOMMAND", donc avant le default
ne me ferme pas ma fenêtre.
Pourquoi ?
Je voudrai savoir : WM_SYSCOMMAND reçoit quelque chose à la fermeture de ma
fenêtre ?
Si WndProc renvoie 0 (zéro), ça veut bien dire qu'on ignore l'évènement ?
Et DefWindowProc gère tout ce qu'on lui envoie *par défaut* quand on ne
souhaite pas le gérer ? Donc indispensable dans un programme quel qu'il soit
non ?
Un petit cours ou un lien me ferait le plus grand bien, merci :)

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) // On regarde le message qui arrive.
{
case WM_KEYDOWN: // Touche appuyée.
switch(wParam)
{
case VK_ESCAPE:
PostQuitMessage(0); // Destruction de la fenêtre.
break;
};
break;
case WM_SIZE: // Redimensionnement de la fenêtre.
Resize(LOWORD(lParam),HIWORD(lParam));
break;
case WM_CLOSE: // Fermeture de la fenêtre.
PostQuitMessage(0);
break;
case WM_SYSCOMMAND : // Commande système.
switch (wParam)
{
case SC_SCREENSAVE: // Economiseur d'écran qui essaye de
démarrer.
return 0; // On gère cet évènement et on ne fait rien.
case SC_MONITORPOWER: // Moniteur qui rentre en mode veille.
return 0; // On gère cet évènement et on ne fait rien.
}
default: // Tous les messages non gérés...
return DefWindowProc(hWnd, uMsg, wParam, lParam); // ...on les envoie à
la fonction de gestion par défaut.
break;
}
return 0; // On renvoie 0.
}

--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.os.ms-windows.programmation
fr.comp.graphisme.programmation

2 réponses

Avatar
Vincent Burel
"Frédéri MIAILLE" wrote in message
news:bmv53b$3ru$
Bonjour.
Dans mon WndProc, je ne comprend pas tout.
J'ai mis des commentaires et je souhaiterai savoir s'ils sont mauvais.
Aussi, mettre un break pour le "case WM_SYSCOMMAND", donc avant le default
ne me ferme pas ma fenêtre.
Pourquoi ?
Je voudrai savoir : WM_SYSCOMMAND reçoit quelque chose à la fermeture de


ma
fenêtre ?
Si WndProc renvoie 0 (zéro), ça veut bien dire qu'on ignore l'évènement ?



ca dépend , regardez les doc sur les messages.

Et DefWindowProc gère tout ce qu'on lui envoie *par défaut* quand on ne
souhaite pas le gérer ? Donc indispensable dans un programme quel qu'il


soit
non ?



indispensable dans un windows (créée avec CreateWindow) oui !


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM


lParam)
{
switch (uMsg) // On regarde le message qui arrive.
{
case WM_KEYDOWN: // Touche appuyée.
switch(wParam)
{
case VK_ESCAPE:
PostQuitMessage(0); // Destruction de la fenêtre.



non, il faut passer par WM_CLOSE ou WM_DESTROY

case WM_CLOSE: // Fermeture de la fenêtre.
PostQuitMessage(0);



non, il faut appeler DestroyWindow ou passer par WM_DESTROY

ci dessous la callback minimale standart :

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) // On regarde le message qui arrive.
{
case WM_CREATE:
return 0;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0)
return 0;
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


VB
Avatar
Christian ASTOR
Frédéri MIAILLE wrote:
>Je voudrai savoir : WM_SYSCOMMAND reçoit quelque chose à la fermeture de
ma fenêtre ?

Ben oui, SC_CLOSE (et SPY++ ?) et il faut gérer tous les autres SC_*,
donc on fait généralement ds le WM_SYSCOMMAND :

default:
return DefWindowProc(hWnd,WM_SYSCOMMAND,wParam,lParam);

Et on ne teste pas "switch (wParam)" mais "switch(wParam & 0xFFF0)"


Et DefWindowProc gère tout ce qu'on lui envoie *par défaut* quand on ne
souhaite pas le gérer ? Donc indispensable dans un programme quel qu'il soit
non ?



Oui, elle appelle la WindowProc() que Windows a défini lors du
RegisterClass()

Et les valeurs de retour dépendent des messages (cf doc)

(& WM_KEYDOWN ne se fait pas comme a dit Vincent)
(& WM_CLOSE set à intercepter ou non la fermeture)