Quelques problèmes avec MDI quand plusieurs fenêtres filles
ArthurAuguste
Messages postés107Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention17 février 2018
-
28 juil. 2011 à 23:32
ArthurAuguste
Messages postés107Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention17 février 2018
-
31 juil. 2011 à 08:58
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 très 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
A voir également:
Quelques problèmes avec MDI quand plusieurs fenêtres filles
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 31 juil. 2011 à 00:18
salut,
Quand tu alloues une structure dans la pile (dans une fonction). Remplis la structure de 0. RtlZeroMemory(). Surtout si tu te sers de cette structure en entrée dans d'autres fonctions.
Je ne sais pas si cela t'enleveras ce problème mais il t'evitera de t'en creer.
ArthurAuguste
Messages postés107Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention17 février 2018 31 juil. 2011 à 08:58
Merci pour la réponse, mais en fait je viens de trouver la solution à l'adresse ci-dessous:
http://msdn.microsoft.com/en-us/library/ms644909(v=vs.85).aspx) 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.
@+