[C++] position curseur souris et MFC

position curseur souris et MFC [C++] - C++ - Programmation

Marsh Posté le 05-02-2004 à 21:14:34    

pourquoi utiliser la fonction GetCursorPos(), alors que le paramètre "point" de la fonction onLButtonDown contient une classe CPoint représentant les coordonnées du curseur de la souris ?
de plus, évite les sprintf et autres char buf[256], tu bosses en MFC alors utilise les classes adéquates :
 

Code :
  1. void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3. // TODO: Add your message handler code here and/or call default
  4. CString str("" );
  5. str.Format("Coordonnée x : %d, coordonnée y : %d",point.x, point.y);
  6. MessageBox(str,"Coucou", MB_OK);
  7. CDialog::OnLButtonDown(nFlags, point);
  8. }


Message édité par Harkonnen le 05-02-2004 à 21:18:15

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2004 à 21:14:34   

Reply

Marsh Posté le 05-02-2004 à 22:08:40    

Harkonnen a écrit :

pourquoi utiliser la fonction GetCursorPos(), alors que le paramètre "point" de la fonction onLButtonDown contient une classe CPoint représentant les coordonnées du curseur de la souris ?
de plus, évite les sprintf et autres char buf[256], tu bosses en MFC alors utilise les classes adéquates :
 

Code :
  1. void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3. // TODO: Add your message handler code here and/or call default
  4. CString str("" );
  5. str.Format("Coordonnée x : %d, coordonnée y : %d",point.x, point.y);
  6. MessageBox(str,"Coucou", MB_OK);
  7. CDialog::OnLButtonDown(nFlags, point);
  8. }



En bossant sur un programme C/win32, j'avais eu des tas de problème parce que les coordonnées du pointeur passées en paramètre du message ne correspondaient pas aux coordonnées renvoyées par GetCursorPos(), et j'ai jamais compris pourquoi.

Reply

Marsh Posté le 05-02-2004 à 22:34:12    

R3g a écrit :

En bossant sur un programme C/win32, j'avais eu des tas de problème parce que les coordonnées du pointeur passées en paramètre du message ne correspondaient pas aux coordonnées renvoyées par GetCursorPos(), et j'ai jamais compris pourquoi.


Normal. GetCursorPos() te renvoie les coordonnées du curseur en coordonnées écran, alors que le paramètre lParam du message WM_LBUTTONDOWN contient les coordonnées du curseur en coordonnées client.
En coordonnées écran, le point (0,0) se situe en haut à gauche de l'écran, alors qu'en coordonnées client, ce point se situe en haut à gauche de la zone client de la fenêtre.
Tu dois donc convertir les coordonnées écran en coordonnées client via la fonction ScreenToClient().


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2004 à 22:37:18    

Harkonnen a écrit :


Normal. GetCursorPos() te renvoie les coordonnées du curseur en coordonnées écran, alors que le paramètre lParam du message WM_LBUTTONDOWN contient les coordonnées du curseur en coordonnées client.
En coordonnées écran, le point (0,0) se situe en haut à gauche de l'écran, alors qu'en coordonnées client, ce point se situe en haut à gauche de la zone client de la fenêtre.
Tu dois donc convertir les coordonnées écran en coordonnées client via la fonction ScreenToClient().

Oui mais même : en fait le problème c'est que je cherchais à suivre les mouvements de la souris pour pouvoir déplacer une fenetre en maintenant le bouton gauche enfoncé n'importe où sur le fenêtre. Si je déplaçais la souris très vite, les coordonnées que je récupérais avec le messages avaient un temps de retard, où parfois étaient complètement à l'ouest (genre loin en dehors de l'écran). Alors qu'en appelant GetCursorPos() dans la méthode traitant le message, c'était bon.

Reply

Marsh Posté le 05-02-2004 à 23:08:57    

RedMax a écrit :

merci bien.. une autre question: comment faire pour afficher cette information en bas a gauche (dans la barre d'etat d ela fenetre MFC en fait)?


D'abord, je corrige ma précédente réponse. J'avais pas lu que tu faisais une application SDI, du coup le code que je t'ai donné ne marchera pas (je pensais que tu faisais une application Dialog Based).
 
En fait, tu as fait une erreur : tu ne dois pas constater l'évènement déclenché par le clic dans la classe CMainFrame, mais dans la classe CView associée à ton application SDI. Le code que je t'ai donné devient :
 

Code :
  1. void CxxxView::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.    // TODO: Add your message handler code here and/or call default
  4.    CString str("" );
  5.    str.Format("Coordonnée x : %d, coordonnée y : %d", point.x, point.y);
  6.    MessageBox(str,"Coucou", MB_OK);
  7.    CView::OnLButtonDown(nFlags, point);
  8. }


 
CxxxView est la classe CView associée à ton application (si ton appli s'appelle "toto", la classe s'appellera "CtotoView" ).
 
Ensuite, pour la barre d'état :
- d'abord, ouvre le fichier MainFrm.h, et modifie la ligne
 

Code :
  1. protected:
  2.    CStatusBar  m_wndStatusBar;


 
en
 

Code :
  1. public:
  2.    CStatusBar  m_wndStatusBar;


 
La barre d'état sera accessible à partir de la vue (en architecture doc/view, toutes les opérations graphiques se font dans la vue).
 
Ouvre ensuite le fichier CxxxView.h, et insère cette ligne dans la déclaration de la classe :
 

Code :
  1. private:
  2.    CStatusBar *m_pStatusBar;


 
on déclare ainsi un pointeur vers une instance de CStatusBar, qui  sera référencé par la StatusBar du MainFrame (qu'on a mis en public, donc accessible).
 
enfin, dans le fichier CxxxView.cpp, rajoute cette ligne au début :
 

Code :
  1. #include "MainFrm.h"


 
ceci pour déclarer la classe CMainFrame, on en aura besoin pour récupérer un pointeur.
 
Ensuite, c'est tout con : dans la vue, tu récupères un pointeur vers le MainFrame de l'application, puis vers la CStatusBar du MainFrame, et tu utilises la méthode SetPaneText() de la classe CStatusBar pour y écrire ton texte. cf MSDN pour plus d'infos sur cette fonction.
 
La récupération des pointeurs se fait dans la méthode OnInitialUpdate() du fichier CxxxView.cpp :
 

Code :
  1. void CxxxView::OnInitialUpdate()
  2. {
  3. CMainFrame *frame = (CMainFrame *) AfxGetApp()->m_pMainWnd;
  4. m_pStatusBar = (CStatusBar *)&(frame->m_wndStatusBar);
  5. }


cette méthode est appelée au moment de la création de la vue. N'oublie pas de la déclarer dans le fichier CxxxView.h
 
Enfin, dans le fichier CxxxView.cpp :
 

Code :
  1. void CxxxView::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3. // TODO: Add your message handler code here and/or call default
  4. CString str("" );
  5. str.Format("Coordonnée x : %d, coordonnée y : %d",point.x, point.y);
  6. m_pStatusBar->SetPaneText(0,str);
  7. CView::OnLButtonDown(nFlags, point);
  8. }


 
si tu veux que les coordonnées de la souris soient affichées au moment où tu déplaces la souris, et non au moment où tu cliques dedans, tu dois faire réagir la vue au message WM_MOUSEMOVE et saisir ceci :
 

Code :
  1. void CxxxView::OnMouseMove(UINT nFlags, CPoint point)
  2. {
  3. // TODO: Add your message handler code here and/or call default
  4. CString str("" );
  5. str.Format("Coordonnée x : %d, coordonnée y : %d",point.x, point.y);
  6. m_pStatusBar->SetPaneText(0,str);
  7. CView::OnMouseMove(nFlags, point);
  8. }


Message édité par Harkonnen le 05-02-2004 à 23:19:57

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2004 à 23:12:33    

R3g a écrit :

Oui mais même : en fait le problème c'est que je cherchais à suivre les mouvements de la souris pour pouvoir déplacer une fenetre en maintenant le bouton gauche enfoncé n'importe où sur le fenêtre. Si je déplaçais la souris très vite, les coordonnées que je récupérais avec le messages avaient un temps de retard, où parfois étaient complètement à l'ouest (genre loin en dehors de l'écran). Alors qu'en appelant GetCursorPos() dans la méthode traitant le message, c'était bon.


Sans doute un bug de Windows, ça m'étonnerait pas remarque, j'ai remarqué aussi des trucs pas clairs avec la souris et son curseur en jouant avec les MFC :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-02-2004 à 12:22:12    

Comment ça "il prend la main totalement" ? :heink:
Si c'est à cause d'un calcul lourd que tu lances au démarrage du programme, il te suffit de créer un thread pour ce calcul


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-02-2004 à 12:30:02    

Ben tu fais comme je te disais : tu balances le dessin des ports dans un CWinThread, comme ça tu ne perds pas la réactivité de ton interface [:sinclaire]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-05-2006 à 09:44:31    

Bonjour,
 
je cherche à faire un peu la même chose mais j'ai quelques petites questions sur ce qui est dit au dessus.
 

Citation :


str.Format("Coordonnée x : %d, coordonnée y : %d", point.x, point.y);


 
Est-ce que les coordonnées dont il est est question correspond au numéro de ligne et numero de colonne ou est-ce totalement different? Car moi je cherche à faire comme ce qu'on trouve dans une application MFC dans une fenêtre de classe CView où on à "Ln %, Col %" affiché dans la barre d'état.
 

Citation :

CxxxView est la classe CView associée à ton application (si ton appli s'appelle "toto", la classe s'appellera "CtotoView" ).  


 
J'ai un problème avec cela car dans mon application, j'ai effectivement une CTotoView qui porte le nom de mon appli mais je n'ai pas la fonction  
 

Code :
  1. void CTotoView::OnInitialUpdate()


 
en revenche, j'ai cette fonction dans une autre classe qui dérive d'une CView.
Que dois-je faire?  
Créer une fonction OnInitialUpdate() dans ma classe CTotoView ou implémenter celle déja existante dans mon autre classe?
 
Merci beaucoup si vous avez réussi à me suivre ;)

Reply

Marsh Posté le 07-05-2006 à 12:52:44    

Harkonnen a écrit :

Sans doute un bug de Windows, ça m'étonnerait pas remarque, j'ai remarqué aussi des trucs pas clairs avec la souris et son curseur en jouant avec les MFC :D


Si tu oublies de faire des SetCapture, il faut s'attendre à des problèmes. Sinon je n'ai pas rencontré de problème avec les fonctions du curseur.

Reply

Marsh Posté le 07-05-2006 à 12:52:44   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed