OVH Cloud OVH Cloud

RTFBox Comment déterminer la position XY du curseur

2 réponses
Avatar
Driss HANIB
Bonjour à tous,

je suis toujours sur mon projet RTF.

J'ai trouvé sur le net un morceau de programme qui permet au curseur de
suivre la position de la souris.

Par contre je voudrais déterminer pour une position du curseur donnée, les
coordonnées XY par rapport à l'écran.
En effet j'ai ajouter la posiibilité d'insérer des caractères spéciaux :
ceci apparait dans une fenetre (en fait un picturebox avec des boutons pour
chaque caracatère disponible) mais je voudrai faire en sorte que cette
fenetre ne cache le curseur dans le texbox..

Merci pour vos pistes

Driss

2 réponses

Avatar
Jacques93
Bonjour Driss HANIB,
Driss HANIB a écrit :
Bonjour à tous,

je suis toujours sur mon projet RTF.

J'ai trouvé sur le net un morceau de programme qui permet au curseur de
suivre la position de la souris.

Par contre je voudrais déterminer pour une position du curseur donnée, les
coordonnées XY par rapport à l'écran.
En effet j'ai ajouter la posiibilité d'insérer des caractères spéciaux :
ceci apparait dans une fenetre (en fait un picturebox avec des boutons pour
chaque caracatère disponible) mais je voudrai faire en sorte que cette
fenetre ne cache le curseur dans le texbox..




Il y a un petit piège, me semble t-il, au niveau de la terminologie,
entre curseur, utilisé pour nommer le point d'insertion dans une zone de
saisie, et le curseur de la souris. Dans les API's :

Point d'insertion (ou "curseur" de saisie) = Caret
Curseur de la souris = Cursor

Les API's permettant de déterminer leur position sont très similaires :

GetCursorPos lpPoint -> Position de la souris
GetCaretPos lpPoint -> Position du point d'insertion

Mais tout n'est pas si simple. GetCursorPos renvoie une position
relative à l'écran. GetCaretPos un position relative a son conteneur,
c'est à dire au minimum sa fenêtre (éventuellement à une Frame, etc)
De plus pour bien faire, il faut tenir compte de la hauteur de la barre
de titre, et des bordures de chaque fenêtre (la valeur retournée étant
relative à la zone cliente de la fenêtre).

Autre petit détail, GetCaretPos renvoie un point, mais le "Caret" lui
même occupe un rectangle dont la taille peux varier :

<http://msdn.microsoft.com/en-us/library/ms646968(VS.85).aspx>


Un point de départ, loin d'être parfait :

Option Explicit

Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI)
As Long
Private Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI)
As Long

Private Const SM_CYCAPTION = 4

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As
Long) As Long

Private Sub rtf_Change()
Dim CursorPos As POINTAPI
Dim CaretPos As POINTAPI
Dim TBHeight As Long

GetCursorPos CursorPos
GetCaretPos CaretPos
TBHeight = GetSystemMetrics(SM_CYCAPTION)
Debug.Print "Souris : " & CursorPos.x & " - " & CursorPos.y & _
", Curseur : " & (rtf.Left + Me.Left) /
Screen.TwipsPerPixelX + CaretPos.x & _
" - " & (rtf.Top + Me.Top) /
Screen.TwipsPerPixelY + TBHeight + CaretPos.y

End Sub



--

Cordialement,

Jacques.
Avatar
Driss HANIB
Bonjour Jacques,

merci ton bout de code je pense qu'il va m'aider; c'est effectivement le
caret qui m'intéresse.

je regarde cela et je reviens vers toi

Driss

"Jacques93" a écrit dans le message de news:

Bonjour Driss HANIB,
Driss HANIB a écrit :
Bonjour à tous,

je suis toujours sur mon projet RTF.

J'ai trouvé sur le net un morceau de programme qui permet au curseur de
suivre la position de la souris.

Par contre je voudrais déterminer pour une position du curseur donnée,
les coordonnées XY par rapport à l'écran.
En effet j'ai ajouter la posiibilité d'insérer des caractères spéciaux :
ceci apparait dans une fenetre (en fait un picturebox avec des boutons
pour chaque caracatère disponible) mais je voudrai faire en sorte que
cette fenetre ne cache le curseur dans le texbox..




Il y a un petit piège, me semble t-il, au niveau de la terminologie, entre
curseur, utilisé pour nommer le point d'insertion dans une zone de saisie,
et le curseur de la souris. Dans les API's :

Point d'insertion (ou "curseur" de saisie) = Caret
Curseur de la souris = Cursor

Les API's permettant de déterminer leur position sont très similaires :

GetCursorPos lpPoint -> Position de la souris
GetCaretPos lpPoint -> Position du point d'insertion

Mais tout n'est pas si simple. GetCursorPos renvoie une position relative
à l'écran. GetCaretPos un position relative a son conteneur, c'est à dire
au minimum sa fenêtre (éventuellement à une Frame, etc)
De plus pour bien faire, il faut tenir compte de la hauteur de la barre de
titre, et des bordures de chaque fenêtre (la valeur retournée étant
relative à la zone cliente de la fenêtre).

Autre petit détail, GetCaretPos renvoie un point, mais le "Caret" lui même
occupe un rectangle dont la taille peux varier :

<http://msdn.microsoft.com/en-us/library/ms646968(VS.85).aspx>


Un point de départ, loin d'être parfait :

Option Explicit

Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI)
As Long
Private Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As
Long

Private Const SM_CYCAPTION = 4

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As
Long) As Long

Private Sub rtf_Change()
Dim CursorPos As POINTAPI
Dim CaretPos As POINTAPI
Dim TBHeight As Long

GetCursorPos CursorPos
GetCaretPos CaretPos
TBHeight = GetSystemMetrics(SM_CYCAPTION)
Debug.Print "Souris : " & CursorPos.x & " - " & CursorPos.y & _
", Curseur : " & (rtf.Left + Me.Left) /
Screen.TwipsPerPixelX + CaretPos.x & _
" - " & (rtf.Top + Me.Top) / Screen.TwipsPerPixelY
+ TBHeight + CaretPos.y

End Sub



--

Cordialement,

Jacques.