Pb avec WM_SIZE et MoveWindow

yerosnimus Messages postés 18 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 15 janvier 2007 - 25 nov. 2004 à 17:59
yerosnimus Messages postés 18 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 15 janvier 2007 - 26 nov. 2004 à 10:33
Bonjour,

J'ai un problème avec une adaptation d'un code trouvé dans le Petzold, figure 9-5 COLORS1.C

Dans ce code, l'auteur crée 3 contrôles "scroll" qui vont modifier la couleur d'un contrôle "static".
Pour cela, dans la WndProc, cas WM_CREATE, il fait appel à CreateWindow une première fois pour créer la "static" et juste après dans une boucle for, il crée les 3 contrôles.
Ensuite vient un WM_SIZE qui fait appel une première fois à MoveWindow pour la "static", puis dans une boucle for, fait appel à MoveWindow pour positionner les contrôles.

Pour ma part, je voulais scinder ma fenêtre principale en 3 "static".
J'ai donc utilisé une boucle for dans le WM_CREATE qui fait appel à la fonction CreateWindow.
Puis dans le WM_SIZE, je reprends la boucle for pour faire appel à MoveWindow. Mais, il y a un gros problème avec le WM_SIZE.

En effet quand le cas WM_CREATE se termine, je retourne sur la fonction WinMain qui bien sûr fait appel à la fonction MoveWindow pour afficher ma fenêtre principale. Quand cette fonction se déclenche, l'application envoie un WM_SIZE, on rentre alors dans boucle qu'on parcoursu une 1ère fois, donc on passe 1ère fois sur MoveWindow().
Puis, on passe une 2ème fois dans boucle, donc on repasse une 2ème fois sur MoveWindow(). Et là, l'événement WM_SIZE est à nouveau envoyé, ce qui a pour effet de me faire rentrer à nouveau dans la boucle avec mon compteur à 0.
Ensuite je passe normalement 3 fois dans la boucle pour en ressortir normalement.

Malheureusement, en plus de ces passages que je trouve un peu étrange, c'est les dimensions de ma fenêtre principale qui sont modifiée.
Je mets ci-dessous la partie du code qui me pose pb, j'ai volontairement placé des valeurs fixes dans les MoveWindow().

case WM_CREATE:
if (!fExistChild)
{
fExistChild = 1;
for (i=0; i<3; i++)
{
// les ID des fenêtres sont 900, 901 et 902
hwndChild[i] = CreateWindow(TEXT("static"),
(LPCTSTR) NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | SS_WHITERECT,
0,0,0,0,
hwnd,(HMENU) (int) (ID_PREMCHILD + i),
hinst, NULL);
}
}
return 0;

case WM_SIZE:

for (i=0; i<3; i++)
{
MoveWindow (hwndChild[i],0,0,30,50,TRUE);
ShowWindow (hwndChild[i], SW_SHOW);
}

return 0;

Merci d'avance pour vos explications

Cordialement,

Jerome

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 nov. 2004 à 18:22
fExistChild, a quoi sert ???

aucune raison que WM_SIZE se rappelle seul ni que ta fenetre modifie sa taille.

ciao...
BruNews, MVP VC++
0
yerosnimus Messages postés 18 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 15 janvier 2007
25 nov. 2004 à 20:50
fExistChild permet de tester si je suis déjà passé par WM_CREATE et ça m'empêche de boucler lors de l'appel de CreateWindow. C'est un conseil qui m'a été donné sur ce forum et ça a très bien marché.

Je pense que WM_SIZE est appelé par MoveWindow(), mais je ne m'explique pas le comportement de mon programme. Je peux envoyer le source sans pb.
Je ne voulais pas surcharger mon post sur ce forum, c'est pourquoi je n'en ai mis qu'un bout :-)

Cordialement,

Jerome
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 nov. 2004 à 21:06
on ne passe qu'1 seule fois dans WM_CREATE, alors fExistChild vraiment je ne vois pas l'interet.

MoveWindow() influe sur la fenetre dont on passe le handle en 1er param, absolument rien d'autre.

ciao...
BruNews, MVP VC++
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
26 nov. 2004 à 08:52
si je me souviens de ses posts précédents, il utilise la meme classe de fenêtre pour la fenêtre principale et pour les fenêtres enfants => il utilise fExistChild pour savoir si le WM_CREATE vient du parent et des enfanst (ça à l'air de marcher).

Maintenant, WM_SIZE est reçu par le parent ET par les enfants dans la même WndProc => tu le reçoit donc plusieurs fois de suite.

Le plus simple c'est qaund même de faire une WNDCLASS pour la MainFrame et une pour les enfants. Chacun aura sa WndProc et donc pas de problèmes à résoudre par des bidouilles.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yerosnimus Messages postés 18 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 15 janvier 2007
26 nov. 2004 à 10:33
Excellente mémoire ymca2003 !

En plus je pensais avoir été complet dans mon post mais j'ai oublié de préciser que j'utilisais la même WndProc, ce qui est plutôt important.

En tout cas, oui, le mieux serait que je fasse une WNDCLASS, j'ai l'impression que j'ai la tête dans le guidon et que je ne vois pas les solutions simples.

Merci

Jerome
0
Rejoignez-nous