Auteur de questions
[MFC] Problème CDialogBar dans DLL

Discussion générale
-
Bonjour,
Je veux créer et ancrer une CDialogBar dans la fenêtre principale de mon application ( fenêtre de type CMDIFrameWnd ) mais à partir d'une DLL ( le template de la CDialogBar étant défini dans le fichier *.rc et le resource.h de la DLL ).
Pour ce faire, je passe un pointeur en paramètre dans la fonction exportée de la DLL sur la CMDIFrameWnd sur lequel je souhaite attacher cette barre de dialogue ( le pointeur est bon, car j'arrive à faire des opérations sur le CMDIFrameWnd en passant par lui ).
J'arrive à créer la CDialogBar mais elle reste invisible...( alors qu'elle apparait si je la crée de la même manière mais à partir de l'*.exe principal . )
Merci par avance de vos réponses.
- Type modifié Ciprian Duduiala mardi 17 mai 2011 08:57 pas de réponse de l'utilisateur qui a lancé la question
Toutes les réponses
-
-
Il faut différentier les objets "fenêtres" C++ des objets GDI/Kernel que ces objets "fenêtres" gèrent.
Créer un objet C++ ne crée pas instantanément des objets GDI/Kernel associée.
Pouvez-vous vérifier que les objets GDI/Kernel associés à votre CMDIFrameWnd sont déjà créé quand vous appelez la fonction exportée de la DLL ?
Un exemple de code C++, histoire de débuguer serait bien pratique, ainsi que la version des MFC.
Paul Bacelar, Ex - MVP VC++ -
Bonjour,
Merci pour vos réponses.
La solution est la suivante ( si ça intéresse quelqu'un ) :
Depuis la fonction exportée de la DLL, juste après avoir crée la barre, il faut faire un "RepositionBars"
=> pCadre->RepositionBars(IDD_DLGBAR,IDD_DLGBAR,AFX_IDW_PANE_FIRST); // pCadre est le ptr sur le CMDIFrameWnd de l'exe
Si une barre d'état est présente, il faut repositionner la DialogBar au dessus de cette StatusBar:
=> RECT rect;
=> pCadre->GetClientRect(&rect);
=> rect.bottom-=18; // car 18 est la hauteur standard d'une barre d'état
=> pCadre->RepositionBars(IDD_DLGBAR,IDD_DLGBAR,AFX_IDW_PANE_FIRST,CWnd::reposDefault,NULL,&rect );
Désolé pour le retard, incident clos ( mais je ne sais pas comment le marquer comme tel sur ce forum, je suis nouveau ! ).
-
Je pense que mon explication est la bonne.
RepositionBars doit forcer l'instanciation des objets Kernel pour calculer le layout de chaque fenêtre.
Faites attention avec les valeurs en dur comme "18 est la hauteur standard d'une barre d'état", le moinder thème de bureau est susceptible de changer ce paramètre.
Merci pour ce retour. ;-)
Paul Bacelar, Ex - MVP VC++