IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Focus sur une boîte de dialogue


Sujet :

MFC

  1. #1
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut Focus sur une boîte de dialogue
    Bonjour,

    Pour une DLL, j'ai fait une fonction qui affiche une boîte de dialogue MFC:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int __stdcall CallHistBTDlg()
    {
          HistBTDlg Dlg;
          Dlg.DoModal();
    }
    J'appelle cette fonction dans une autre DLL VB. Le problème, c'est que ma boîte de dialogue n'apparaît pas au premier plan, elle est masquée par l'application appelante. Ceci est du au fonctionnement interne de cette application, et je ne peux pas agir dessus.

    Ce que je cherche, c'est un moyen de prendre la main une fois que la boîte de dialogue est affichée, et de lui redonner le focus. OnInitDialog intervient trop tôt.

    Est-ce qu'il y a une autre fonction que DoModal qui me permettrait de prendre la main juste après l'affichage de la boîte ?

    Toute aide est la bienvenue !

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    essaye de faire BringWindowToTop( );
    dans OnInitDialog.


  3. #3
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    je reconnais volontier que mes messages ne sont pas passionnants mais j'avais précisé que OnInitDialog intervient trop tôt, l'application appelante prend la main après l'affichage de la boîte. J'ai quand même essayé, mais ça ne donne rien.

    Comment prendre la main après l'affichae de la boîte, mais avant toute action de l'utilisateur ?

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pourquoi ne pas ratacher ta boite de dialogue à la précedente ? avec SetParent

  5. #5
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par nico-pyright(c)
    pourquoi ne pas ratacher ta boite de dialogue à la précedente ? avec SetParent
    A quel moment est-ce que je pourrai faire ce rattachement ? Pas après le DoModal, sinon c'est inutile. Donc ce serai quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int __stdcall CallHistBTDlg()
    {
          HistBTDlg Dlg;
          Dlg.SetParent(PtrFenetreAppliAppelante);
          Dlg.DoModal();
    }
    Je ne sais pas comment obtenir le pointeur vers la fenêtre de l'application appelante car ma fonction est dans une DLL, et je ne peux pas avoir d'information sur celui qui va l'appeler.

    Merci pour ton aide

  6. #6
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Le module client (ta dll VB) étant une application ou DLL non MFC, j'imagine que ta DLL C++ est régulière MFC.
    Est-elle régulière?
    Si oui, alors tu as oublié le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    à mettre au début de toutes fonctions exportées.


  7. #7
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Je ne sais pas vraiment si ma DLL est régulière ou non. Comment le savoir ?

    Quoi qu'il en soit, merci pour l'info, mais ça ne résoud pas mon problème.

  8. #8
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Est-ce que ta DLL as t'elle un objet CWinApp?

  9. #9
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Oui, sa classe principale dérive de CWinApp.

    C'est donc ça une DLL régulière MFC ?

  10. #10
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    C'est la réponse à ta question pour savoir comment détecter une dll régulière d'une dll d'extension qui n'en dispose pas.

  11. #11
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    et maintenant écris un code comme celui-ci

    extern "C" int WINAPI CallHistBTDlg(); // dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    extern "C" int WINAPI CallHistBTDlg()
    {
          AFX_MANAGE_STATE(AfxGetStaticModuleState());
     
          HistBTDlg Dlg;
          Dlg.DoModal();
    }

  12. #12
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Dis moi dans le fichier *.def de ta dll tu as mis le nom de ta fonction exporté du genre

    @1 pour siginifier qu'il s'agit de la première fonction exportée ou @x pour la x ième

  13. #13
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Pour l'instant, dans mon .h, j'ai fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifdef _WINDLL
    #define DLLDEC __declspec(dllexport)
    #else
    #define DLLDEC __declspec(dllimport)
    #endif
    #ifdef __cplusplus
    extern "C"
    {
    #endif
          DLLDEC int __stdcall CallHistBTDlg();
    #ifdef __cplusplus
    }
    #endif
    Dans le fichier d'export:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    EXPORTS
    CallHistBTDlg = _CallHistBTDlg@0
    (le @0 semble correspondre au nombre d'octets passés en paramètre - en tout cas ça marche bien si je résonne comme ça).

    Quels sont les avantages de ce que tu proposes ? Mais aussi, quel est le lien avec mon problème de focus !?

    Je n'ai aucun problème avec l'appel depuis VB de mes fonctions C++ exportées. Le problème de focus est du à l'application pour laquelle je développe ma Dll. D'ailleurs, j'ai le même problème si j'affiche simplement une message box en VB. Ce que je cherche, c'est une astuce qui me permettrait de redonner le focus à ma boîte de dialogue.

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    j'avais le même problème que toi entre une application console faisant apparaître une dialogue appartenant a une dll .
    Au premier appel la dlg apparaît derrière l'application.
    Tu devrais faire une fonction dans ta dll qui reçoit le handle de fenêtre HWND de l'application principale.
    apres essayé de fournir ce handle à ta dialogue comme parent.
    si ça ne résout pas le problème essayer la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::PostMessage(hwnd,WM_SYSCOMMAND,SC_HOTKEY,MAKELONG(hwnd,0));
    ou hwnd correspond au handle de fenetre de l'application principale.

  15. #15
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Quoiqu'il en soit j'espère que tu as mis le AFX_MANAGE_STATE.
    Si le problème n'est pas dans ta dll C++ alors revois ton code VB.
    Comment est-ce que tu appelles CallHistBTDlg()

  16. #16
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Son probleme de focus n'a rien a voir avec AFX_MANAGE_STATE
    sa dialogue s'affiche !

  17. #17
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par farscape
    salut,
    j'avais le même problème que toi entre une application console faisant apparaître une dialogue appartenant a une dll .
    Au premier appel la dlg apparaît derrière l'application.
    Tu devrais faire une fonction dans ta dll qui reçoit le handle de fenêtre HWND de l'application principale.
    apres essayé de fournir ce handle à ta dialogue comme parent.
    si ça ne résout pas le problème essayer la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::PostMessage(hwnd,WM_SYSCOMMAND,SC_HOTKEY,MAKELONG(hwnd,0));
    ou hwnd correspond au handle de fenetre de l'application principale.
    J'ai pu essayé les 2 solutions que tu proposes, mais sans résultat... Je vais un peu laissé tombé, parce que j'y ai déjà passé beaucoup de temps. Merci bien pour ton aide en tout cas.

  18. #18
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    J'ai trouvé une solution, un petit mélange de vos différentes contributions:

    Dans ma boîte de dialogue, je capte l'évènement ShowWindow. Voici le code à placer dans la méthode OnShowWindow:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ::SetWindowPos(m_hWnd ,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
    
    Autant vous dire que j'étais bien content !
    Et déçu à la fois d'avoir passé autant de temps en étant si près du but...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/05/2009, 11h36
  2. FAQ - imprimer une boîte de dialogue
    Par Eugénie dans le forum MFC
    Réponses: 6
    Dernier message: 27/08/2004, 14h34
  3. [MFC] afficher une boîte de dialogue
    Par bigboomshakala dans le forum MFC
    Réponses: 13
    Dernier message: 10/05/2004, 15h22
  4. [Kylix] Imprimer le contenu d'une boîte de dialogue
    Par cmp-france dans le forum EDI
    Réponses: 13
    Dernier message: 18/10/2003, 21h31
  5. Réponses: 3
    Dernier message: 29/08/2003, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo