Pb avec WM_SIZE et MoveWindow

Signaler
Messages postés
18
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2007
-
Messages postés
18
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2007
-
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
A voir également:

5 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
fExistChild, a quoi sert ???

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

ciao...
BruNews, MVP VC++
Messages postés
18
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2007

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
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.
Messages postés
18
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2007

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