forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006
-
13 févr. 2006 à 13:26
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006
-
17 févr. 2006 à 14:20
Bonjour,
Dans une TextBox j'ouvre un menu contextuel personnalisé avec le bouton droit de la souris. Comment faire pour déplacer le focus à l'endroit cliqué avec ce même bouton droit donc ne pas avoir à cliquer d'abord avec le bouton gauche ?
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 14 févr. 2006 à 13:38
Bonjour,
Le problème c'est que ça ne marche pas avec le bouton droit. D'ailleurs Text1.Set Focus est inutile avec le bouton gauche car le clic avec le bouton gauche est pris en charge par Windows pour placer le curseur à l'endroit cliqué.
Le menu par défaut pour le bouton droit est désactivé grâce à une solution proposée dans ce forum.
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 14 févr. 2006 à 18:45
Voici la solution proposée sur ce forum pour désactiver le menu par défaut et qui marche. Heureusement car cela dépasse mes compétences d'autodidacte limitées à Visual Basic. Et si je veux mon menu contextuel par le bouton droit et non gauche, c'est pour ne pas avoir à cliquer 2 fois pour insérer du texte par exemple dans la TextBox.
Merci pour le suivi de ce problème.
"Autre solution
Pour un composant TextBox ...
Dans Ta Form :
Private Sub Form_Load()
Hook Text1.Hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unhook
End Sub
Private Sub TextBox_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
PopupMenu TonMenuAToi
End Sub
Dans un Module.bas
Option Explicit
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal Hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal Hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = -4
Public Const WM_RBUTTONUP As Long = &H205
Private LngPrevWndProc As Long
Private IsHooked As Boolean
Private HookedHWND As Long
Public Sub Hook(Hwnd As Long)
'Mise en place du hook s'il n'est pas déjà actif
If IsHooked = False Then
HookedHWND = Hwnd
LngPrevWndProc = SetWindowLong(HookedHWND, GWL_WNDPROC, AddressOf WindowProc)
IsHooked = True
End If
End Sub
Public Sub Unhook()
'Suppression du hook s'il est actif
Dim LngTemp As Long
If IsHooked = True Then
LngTemp = SetWindowLong(HookedHWND, GWL_WNDPROC, LngPrevWndProc)
IsHooked = False
End If
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_RBUTTONUP
Case Else
WindowProc = CallWindowProc(LngPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
Tout le mérite revient à fredlynx, mais voici une petite amélioration possible : plutôt que d'intercepter le "MouseUp", il est préférable d'intercepter le "MouseDown". Ainsi le menu contextuel standard n'apparaît pas et l'événement VB "MouseUp" fonctionne pour faire apparaître son propre menu.
Pour cela ajouter dans le module :
Public Const WM_RBUTTONDOWN As Long = &H204
et remplacer dans la fonction WindowProc :
Case WM_RBUTTONUP
par
Case WM_RBUTTONDOWN
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 16 févr. 2006 à 09:20
Désolé mais c'est pareil. Sur le click droit le curseur disparaît et si je fais un coller ce coller se place là où était le curseur et non pas là où j'ai cliqué avec le bouton droit.
Je travaille avec VB5 et le logiciel passe bien sur les procédures du module 1.
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 16 févr. 2006 à 19:30
Il s'agit du coller classique où l'on insère le texte contenu dans le presse-papier à l'endroit où se trouve le curseur. Ce coller est un des sous-menus de mon menu contextuel. (Le menu par défaut l'a aussi, bien sûr, mais j'ai d'autres sous-menus plus personnels.)
Oui, pour le moment il ne s'agit que d'une TextBox.
.... tu demandes "copier le texte là où se trouve le curseur", alors que tu veux déplacer le "curseur" (care en réalité, pas curseur....) pour y insérer le texte...
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 17 févr. 2006 à 10:35
Bonjour,
Ca marche ! Mais il y a quand même une anomalie :
Je clique avec le bouton droit de la souris à un endroit du texte, ce qui y place le curseur. J'insère un 1er caractère en tapant par exemple a sur le clavier. Ce a est pris comme ALT + a, il n'est donc pas affiché. Les caractères tapés qui suivent sont OK.
Les autres fonctions d'édition (couper, copier, ..) sont OK.
PS : je m'en suis aperçu car le a est la touche d'accès rapide de mon menu Affichage (&Affichage). Bien sûr le problème est le même si le 1er caractère tapé n'est pas une touche d'accès rapide.
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 17 févr. 2006 à 12:40
En fait je m'aperçois que dans Word on ne peut pas insérer du tout de caractères après avoir placé le curseur avec le bouton droit. Simplement ouvrir le menu contextuel. On ne peut pas être plus royaliste que le roi. Peut-on inhiber la frappe de caractères tant que le menu contextuel est affiché par exemple à l'aide de KeyAscii = 0 ?
De manière plus génaéale où peut-on trouver de la doc sur Hook, WindowProc = CallWindowProc(LngPrevWndProc, hw, WM_LBUTTONDOWN, wParam, lParam) et ce genre de choses ?