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 :

émulation d'un clic


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut émulation d'un clic
    salut !
    me revoilà avec mes questions :

    j'ai une appli composée de 2 dll et d'un exe. Lors d'un clic sur un bouton dans mon exe, je lance un dialogue (dlg.doModal()).

    Dans une de mes dll, je voudrais qu'en cliquant sur un autre bouton (appartenant à la dll) ça lance cette même dialog. Je me disais que je pourrais émuler le clic de l'exe : faire comme si l'utilisataur avait cliqué sur le bouton de l'exe.

    une idée ?

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    postMessage avec le handle de la fenetre contenant ton bouton, WM_LBUTTONDOWN et l'ID du bouton.
    il y a du linge sur la corde à linge

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    ok, et comment je récupère le handle du dialog ? (qui est défini dans l'exe et pas dans la dll)

    et tant qu'on y est, le handle du bouton.

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    tu passes en paramettre lors d'une initialisation. Pour recuperer le handle, utilise la methose GetSaveHwnd() qui est une methode de CWnd.

    sinon tu peux envoyer ton message au Mainframe qui le retransemttra aux fenetres filles si l'ensemble est bien goupillé

    pour recupere le handle de la mainframe

    AfxGetMainWnd()->GetSafeHwnd();

    GetSafeHwnd() est une methode CWnd
    il y a du linge sur la corde à linge

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    en fait, tout se fait à partir d'une dialog, pas de la fenêtre principale.

    donc dans cette dialog, j'ai une liste et des boutons. Les boutons sont gérés par l'exe et la liste par la dll. J'ai rajouté un menu contextuel (supprimer / modifier) à la liste.
    Si l'utilisateur choisit "modifier", il faut que ça fasse exactement la même chose que le clic sur le bouton "modifier" (géré par l'exe), c'est à dire lancer une autre dialog.

    Et j'ai vraiment beaucoup de mal à récupérer les Handles dont j'ai besoin pour envoyer le message

    ps : ne me dis pas que c'est débile de gérer ça dans 2 trucs différents je le sais

  6. #6
    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
    Ce que je comprends pas, ce que lorsque tu clickes sur modifier ou que tu choisis modifier dans la liste, il y a du code qui est géré, au pire un evenement lancé
    pourquoi vouloir émuler un click de souris alors qu'il te suffirait de lancer la fonction ou quoi que ce soit pour faire le traitement dont tu as besoin

    (a moins que j'ai pas compris, et d'ailleurs, c'est clair que j'ai pas tout compris )

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    parce que le clic sur le bouton lance une dialog qui est définie dans l'exe. et si je choisis "modifier" dans le contextMenu, je suis dans la dll, je ne peux donc pas lancer cette dialog. Et j'ai pas envie de m'embêter à recopier la dialog dans la dll (en plus, c'est un bazar pas possible à cause des liens avec d'autres classes de l'exe que ma dll ne connait pas).

    c'est vraiment le bazar, mais j'ai repris le projet de qqun et je n'ai pas le temps de refaire l'architecture (c'est bien dommage).

  8. #8
    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,si ton projet est dialog based afxGetMainWnd() renvoie le pointeur sur la dialog directe.
    apres affaire de gout :
    tu castes le pointeur sur la classe dialog en question et :
    sois tu appel directe la fonction associee au click du bouton .
    sois tu envoies un message au bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CWnd *pWnd=AfxGetMainWnd();
    pWnd->GetDlgItem(IDC_BUTTON1)->PostMessage(WM_KEYDOWN,' ');
    pWnd->GetDlgItem(IDC_BUTTON1)->PostMessage(WM_KEYUP,' ');
    // ou
    ((CMyDialog *) pWnd)->monClick();

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    c'est une super idée !
    ya juste que la dll ne connait pas IDC_BUTTON1 (enfin, dans mon cas, c'est IDC_MODIFIER)

    et qu'elle ne connait pas non plus CMyDialog (sauf que c'est la fenêtre en cours et qu'il y a peut-être moyen de récupérer son handle ?)

  10. #10
    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
    bon dans ta dll tu connais pas le boutton il te reste plus mettre son numero en dur c'st a dire recuperer sa valeur dans resource.h et faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CWnd *pWnd=AfxGetMainWnd();
    pWnd->GetDlgItem(0x1000)->PostMessage(WM_KEYDOWN,' ');
    pWnd->GetDlgItem(0x1000)->PostMessage(WM_KEYUP,' ');
    ou 0x1000 ici represente le define de mon bouton .

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    merci

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    	CWnd *pWnd=AfxGetMainWnd(); 
    	pWnd->GetDlgItem(1055)->PostMessage(WM_KEYDOWN,' '); 
    	pWnd->GetDlgItem(1055)->PostMessage(WM_KEYUP,' ');
    ça compile.

    mais la fonction liée au clic du bouton 1055 (dans l'exe) n'est pas lancée

  13. #13
    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
    verifie que le handle renvoye par AfxgetMainWnd correspond bien à la Dialogue (voir avec spy ou en debug trace)
    que le GetDlgItem(1055) renvoi un handle de fenetre valide.


  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    voici ce que me dit le debugger :

    pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd *pWnd=AfxGetMainWnd();
    il dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pWnd                              |  {CDll_testDlg hWnd=???}
    this                                 |  {ListeBidule hWnd=0x00020dfa}
    AfxGetMainWnd returned  | {CDll_testDlg hWnd=???}
    pour la(les) ligne(s)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       pWnd->GetDlgItem(1055)->PostMessage(WM_KEYDOWN,' '); 
       pWnd->GetDlgItem(1055)->PostMessage(WM_KEYUP,' ');
    il dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pWnd                                       |  {CDll_testDlg hWnd=???}
    CWnd::GetDlgItem returned      | {CTempWnd hWnd=0x00050d7a}
    CWnd::PostMessageA returned  | 1

  15. #15
    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,
    le pb doit venir du fait de faire afxGetMainWnd() dans la dll le pointeur sur fenetre n'est pas correcte ..
    il faudrait que fasse circuler l'info afxGetMainWnd() du prog principal vers la dll a travers ta fonction d'appel par exemple.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    fonction d'appel de quoi ?
    (pas taper !)

  17. #17
    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,
    la fonction qui appelle le code dans la dll .
    ou faire en sorte d'informer la dll par une fonction d'init le handle de fenetre de l'application.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    parce qu'en fait, quand pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd *pWnd=AfxGetMainWnd();
    le debugger dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pWnd                              |  {CDll_testDlg hWnd=???}
    en fait CDll_testDlg est ma fenêtre principale, pas la dialog dans laquelle je suis.
    Il n'existe pas de fonction directe pour récupérer la fenêtre dans laquelle on est sous forme de CWnd ? (autre que AfxGetMainWnd)

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    alors, j'ai essayé GetActiveWindow() à la place de afxGetMainWnd() et j'ai bien {MaDialog hWnd=???} au lieu de {CDll_testDlg hWnd=???} .

    mais bon, ya toujours les ???. Pourquoi est-ce qu'il ne connait pas sa propre fenêtre ?

  20. #20
    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
    le pb est de savoir ou tu fais le GetActiveWindow() dans la dll ou la dialog concernee.
    si c'est la dialog il suffit de regarder la donnée membre m_hWnd .

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Clic droit/gauche souris
    Par Mouse! dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 30/05/2013, 20h34
  2. Popup avec un clic gauche
    Par Jéremy A dans le forum Composants VCL
    Réponses: 7
    Dernier message: 27/02/2003, 22h15
  3. Evènement sur clic droit !?
    Par soccersoft dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/12/2002, 21h39
  4. gérer le clic gauche-droite en même temps de la sou
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2002, 22h52
  5. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11

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