Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
669 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] position curseur souris et MFC

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] position curseur souris et MFC

n°632736
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-02-2004 à 21:14:34  profilanswer
 

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)
mood
Publicité
Posté le 05-02-2004 à 21:14:34  profilanswer
 

n°632769
R3g
fonctionnaire certifié ITIL
Posté le 05-02-2004 à 22:08:40  profilanswer
 

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.

n°632786
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-02-2004 à 22:34:12  profilanswer
 

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)
n°632789
R3g
fonctionnaire certifié ITIL
Posté le 05-02-2004 à 22:37:18  profilanswer
 

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.

n°632822
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-02-2004 à 23:08:57  profilanswer
 

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)
n°632827
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-02-2004 à 23:12:33  profilanswer
 

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)
n°633399
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-02-2004 à 12:22:12  profilanswer
 

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)
n°633415
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-02-2004 à 12:30:02  profilanswer
 

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)
n°1360187
bubulle63
Posté le 05-05-2006 à 09:44:31  profilanswer
 

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 ;)

n°1361229
slash33
Posté le 07-05-2006 à 12:52:44  profilanswer
 

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.

mood
Publicité
Posté le 07-05-2006 à 12:52:44  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] position curseur souris et MFC

 

Sujets relatifs
différence entre MFC et ATL[javascript] connaitre la position d'un element dans la page ?
comment mettre l'icone DOIGT de la souris sur un bouton ???[MFC] Chargement et affichage d'un Bitmap dans une fenêtre dimensionée
Récupérer la position d'un div avec opéra... Grrrr...[HTML] probleme de position ...
Comment savoir qd la souris passe sur et quitte un contrôle?Pour un site web : faire changer l'image quand on passe la souris
[MFC] Tooltips sur plusieurs lignes...Comment apprendre les MFC
Plus de sujets relatifs à : [C++] position curseur souris et MFC


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR