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

Quelques problèmes avec MDI quand plusieurs fenêtres filles

2 réponses
Avatar
Roger
Bonjour,
Tout d'abord, je n'ai aucun problème lorsque je n'ai qu'une fenêtre fille,
mais dès que j'en ai une deuxième je commence à avoir des mélanges.
Dans l'exemple simplifié ci-dessous, j'ai une 1ère fenêtre fille (sommaire)
qui ne contient que des contrôles statiques et des radioboutons (donc pas de
WM_PAINT à traiter) et la deuxième fenêtre fille est encore plus simple
puisqu'elle est pour l'instant vide.
Les 2 fenêtres filles sont enregistrées avec une couleur de fond identique.
Mes deux fenêtres s'affichent sur l'écran l'une sur l'autre, mais dès que
j'essaie de les déplacer, j'ai des mélanges, les contrôles de la 1ère par
exemple se repeignent sur la seconde ou le cadre de la seconde reste dessiné
sur la 1ère.
Par ailleurs, si je crée la seconde après avoir fait un destroy de la 1ère,
la seconde n'apparaît pas.
Enfin, il y a un cas qui marche sur lequel pour l'instant je n'ai pas trouvé
de problème c'est si je crée la seconde après avoir simplement rendu la 1ère
invisible.
J'ai dû oublier quelque chose dans ma programmation ci-dessous, mais pour
l'instant je ne vois pas quoi.
Ci-dessous un extrait simplifié du code:

// *************** création de la fenêtre mère principale:
Hdlgmain = CreateWindowEx(WS_EX_CLIENTEDGE, classmain, titremain, WS_CAPTION
| WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, lmain, hmain, NULL,
NULL, n0inst, NULL);
// *************** puis dans le WM_CREATE de la callback de Hdlgmain:
css.hWindowMenu=GetSubMenu(GetMenu(Hdlgmain),0); //avec static
CLIENTCREATESTRUCT css; // en début de callback
css.idFirstChild=0;
hMDIClient = CreateWindow("MDICLIENT", (LPCSTR)NULL, WS_CHILD | WS_HSCROLL |
WS_VSCROLL | WS_CLIPCHILDREN, 0, 0, 0, 0, Hdlgmain, NULL, n0inst,
(LPSTR)&css); // création MDI
ShowWindow(hMDIClient,SW_SHOW);
Hdlgsom = CreateWindowEx(WS_EX_CLIENTEDGE, classsom, titresom, WS_CHILD |
WS_CAPTION | WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, lsom, hsom, hMDIClient,
(HMENU)(INT)ID_som, n0inst, NULL); // création 1ère fille
Hdlgvide = CreateWindowEx(WS_EX_CLIENTEDGE, classvide, titrevide, WS_CHILD |
WS_CAPTION | WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, lsom, hsom, hMDIClient,
(HMENU)(INT)ID_vide, n0inst, NULL); // création 2ème fille
SetFocus(Hdlgsom);
// *************** puis en fin de callback de Hdlgsom
default :
return DefMDIChildProc( Hdlgsom, IDMsg, wParam, lParam );
// *************** pour terminer en fin de callback de Hdlgvide
default :
return DefMDIChildProc( Hdlgvide, IDMsg, wParam, lParam );

A noter que j'ai déjà fait les essais suivants qui n'ont rien changé au
phénomène:
- comme dans CLIENTCREATESTRUCT on récupère le menu de la fenêtre
principale, j'ai rajouté un menu dans la fenêtre principale.
- comme c'est normalement la MDI qui gère l'id des fenêtres filles, dans le
CreateWindow des fenêtres filles, j'ai remplacé le (HMENU)ID par NULL
- comme la fenêtre MDI est ci-dessus créée avec des dimensions à 0,0, j'ai
remplacé le 0,0 par les dimensions intérieures de la fenêtre mère
(principale)
tout ceci a donc déjà été essayé, n'a pas apporté de malfonctionnement
supplémentaire, mais n'a rien amélioré non plus.
Enfin, si personne ne trouve, je peux quand même m'en sortir en rendant
simplement invisibles les fenêtres filles que je n'utilise temporairement
pas.
Pourtant ça doit pouvoir marcher puisque les fenêtres filles dans Word ou
Excel ne se mélangent pas.
Merci

2 réponses

Avatar
Christian ASTOR
Roger a écrit :
Bonjour,
Tout d'abord, je n'ai aucun problème lorsque je n'ai qu'une fenêtre fille,
mais dès que j'en ai une deuxième je commence à avoir des mélanges.



Pour un exemple de MDI,
voir le vieil exemple MSDN Multipad.c
(dont parle la doc
http://msdn.microsoft.com/en-us/library/ms644909(v=vs.85).aspx)
Avatar
Roger

Pour un exemple de MDI,
voir le vieil exemple MSDN Multipad.c
(dont parle la doc
http://msdn.microsoft.com/en-us/library/ms644909(v=vs.85).aspx)



Effectivement, j'avais un problème d'initialisation dès le départ pour les
fenêtres filles: je n'avais pas initialisé leur paramètre cbWndExtra dans la
structure de leur WNDCLASS ce qui d'après les infos données à cette adresse
est obligatoire dans le cas de MDI. Plus quelques petits problèmes de
procédure.
Grand merci pour l'adresse.
@+