-
CDialog dans une CView
Je suis occupé à migrer une application MFC pour lui ajouter les fonctionalités de MFC 2008. Mon problème se situe lors de l'ajout du support des "tabbed groups".
Pour résumer simplement, chaque vue (CView) comporte un formulaire sous forme de CDialog. Chacunes de ces vues utilise l'évenement "OnDraw" pour retailler dynamiquement le CDialog à la taille de la vue avec un "SetWindowPos(NULL,ux,uy,w,h,SWP_NOZORDER)". C'est-à-dire que si la vue est retaillées, il faut que le formulaire à l'intérieur suive. Les vues sont créées grâce à des fonctions disponibles dans la ribbon bar. Je n'ai pas choisi ce design et je ne peux pas envisager de le changer.
Mon problème est que l'assert sur cette fonction dans le fichier winoccp.cpp:318 "ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));" échoue lors de la création de la première vue.
Mon observation me montre que la création d'un tab provoque la création d'un conteneur de type TabWnd et que celui-ci n'existerait pas encore lors du premier appel à OnDraw de la vue. Le SetWindowPos() du CDialog est donc appellé mais son m_hWnd n'est pas encore valide à ce moment-là...
Si quelqu'un a une piste pour savoir où je pourrais déplacer cette gestion de la taille des CDialog pour ne pas l'appeller avant la création de son conteneur parent (OnSize est aussi appellé trop tot) ou alors comment créer ce conteneur à l'avance (MDITabNewGroup(FALSE) ne fonctionne pas pour forcer la création du TabWnd).
Merci d'avance
-
J'ai déjà eu des problèmes avec le OnSize() qui est appelé trop tôt et je n'ai jamais trouvé de solution élégante.
Ce que je fait dans ce cas, c'est dans OnInitDialog(), je positionne un membre de la classe booléen à true (ce booléen est initialisé à false dans le constructeur de la classe)
et ensuite je ne traite pas le message OnSize() tant que ce booléen faut false (mais je le passe quand même le message à la classe de base).
C'est pas très propre mais cela m'a dépanné.
Maintenant, les raisons de pourquoi le OnSize() est appelé trop tôt, je n'ai pas trop cherché.