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é:
A noter que j'ai déjà fait les essais suivants qui n'ont rien changé au phénomène:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 // *************** 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); 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); 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 );
- 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
Partager