none
[MFC] Problème CDialogBar dans DLL RRS feed

  • 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
    mercredi 11 mai 2011 08:25

Toutes les réponses

  • Pouvez-vous donner un exmple de code C++ plus complet, pour mieux vous aider à résoudre le probléme...

    Cordialement,


    Delphine GARRO
    vendredi 13 mai 2011 15:19
  • 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++
    mardi 17 mai 2011 12:42
    Modérateur
  • 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 ! ).

    lundi 23 mai 2011 15:14
  • 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++
    lundi 23 mai 2011 16:22
    Modérateur