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 :

[MFC] OnMouseWheel surchagée mais recupere pas l'evenement


Sujet :

MFC

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut [MFC] OnMouseWheel surchagée mais recupere pas l'evenement
    Salutous,

    J'ai developpe une classe qui herite de CWnd.
    J'ai implemante les fonctions de message MAP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);
    	afx_msg	void OnDraw(CDC *pDC);
    	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); // <-- 
    	afx_msg void OnPaint();
    	DECLARE_MESSAGE_MAP()
    Donc je compile bien je passe bien dans mes autres fonctions mais pas dans la fonction OnMouseWheel?
    Je ne recupere pas l'evenement.

    Une idee?

    Merci

  2. #2
    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
    tu as généré avec le classwizard ?
    ON_WM_MOUSEWHEEL() figure bien dans BEGIN_MESSAGE_MAP ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    J'ai cree la classe avec via l'explorateur, mais je n'ai pas le classWizard
    Tout coder a la mano.

    Sinon oui je l'ai bien dans la message MAP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BEGIN_MESSAGE_MAP(CPicture, CWnd)
    	//{{AFX_MSG_MAP(CPicture)
    	ON_WM_CREATE()
    	ON_WM_MOUSEMOVE()
    	ON_WM_MOUSEWHEEL()
    	ON_WM_PAINT()
    	ON_WM_SIZE()
    	ON_WM_TIMER()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    voila voila.

    Au fait au cas ou:
    IDE: Visual C++ 6.0
    OS: WinXP Pro

  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
    comment ca se fait que tu n'ais pas le classwizard ? http://c.developpez.com/faq/vc/?page=IDE#MakeClassView

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Si, j'ai le classe Wizard, mais que pour mes boite de dialogue!
    Mais ma classe n'est pas une classe qui gere une boite de dialogue.

    En fait j'utilise ma classe pour gerer un control(Picture).
    J'ai ecrit la classe a la main.

    Et sinon tout marche niquel sauf cette fonction...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Yo!

    J'ai fait un petit test, j'ai rajouter la fonction pour intercepter les message Wnd:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    BOOL CPicture::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
    	int a;
    	switch(message) {
    	case WM_LBUTTONDOWN:
    		a = 1;
    		break;
    	case WM_MOUSEWHEEL:
    		a = 2;
    		break;
    	default:
    		break;
    	}
     
    	return CWnd::OnWndMsg(message, wParam, lParam, pResult);
    }
    Donc lors d'un clic je passe bien dans la fonction LbuttonDown, mais je ne recupere jamais le message MouseWheel.

    Donc apparement mon control ne recupere pas le message MouseWheel, mais pourquoi ca ferait ca?

  7. #7
    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
    vérifie peut-etre que c'est pas un autre controle qui le capte, ou bien ta fenetre

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    non, c'est pas ca!!!

    Je sais plus quoi faire...
    j'ai fait un petit projet pour essayer avec une seule boite de dialogue donc je suis sur que je ne bloque pas le message et il ne veut quand meme pas.

    Je cree un control sur un element picture d'une boite de dialogue
    Je fais herite la classe qui gere le controlPicture avec Cwnd
    J'intercepte les mouse move mais pas les wheel


    A tout hasard cela pourrait-il venir du fait que le control picture ne recupere pas les evenements molettes?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    907
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 907
    Points : 372
    Points
    372
    Par défaut
    Essaye cette fonction, en envoyant SendMessage vers ta boite de dialogue si elle est visble.

    Christophe,
    -------------------------------------------------------------------

    BOOL CMainFrame:: PreTranslateMessage(MSG* pMsg)
    {
    if (pMsg->message == WM_MOUSEWHEEL)
    {
    CView *pView = GetActiveView() ;
    if (pView != NULL)
    pView->SendMessage(WM_MOUSEWHEEL, pMsg->wParam, pMsg->lParam) ;
    }

    }

  10. #10
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    WM_MOUSEWHEEL est envoyé a la fenetre qui a le Focus uniquement.
    Si ton controle n'a pas le focus, tu n'auras jamais ce message.

    La technique du PreTranslateMessage() permet de voler le message destiné a la fenetre qui a le focus. Si tu es dans l'impossibilité de mettre le focus sur ton controle, c'est la seule solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BOOL CMyDialog::PreTranslateMessage(MSG *pMsg)
    {
      if (pMsg->message==WM_MOUSEWHEEL)
        pMsg->hwnd=m_MonControle.m_hWnd;  // on vole le message
     
      return CDialog::PreTranslateMessage(pMsg);
    }
    @+

Discussions similaires

  1. [MFC VC 2005] Voudrais bien débuguer mais peux pas.
    Par Philippe320 dans le forum MFC
    Réponses: 18
    Dernier message: 28/03/2009, 16h16
  2. Fonctionne avec IE mais pas Mozilla : evenement onkeyup
    Par sandddy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/12/2007, 17h21
  3. Réponses: 5
    Dernier message: 17/06/2005, 16h17
  4. Réponses: 3
    Dernier message: 23/06/2004, 09h04
  5. Réponses: 4
    Dernier message: 30/04/2004, 13h14

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