Positionner le focus avec le bouton droit

forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 1 mars 2006 - 13 févr. 2006 à 13:26
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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 ?

Merci pour la réponse.

14 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 févr. 2006 à 13:59
salut.

voici le principe uniquement avec le bouton gauche.





Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 1 Then

Text1.SetFocus

PopupMenu MNU_MAIN

End If

End Sub





PCPT [AFCK]
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 févr. 2006 à 14:00
ps : pout le bouton droit il faut aussi penser à désactiver le menu par défaut (copier coller etc...)
0
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 févr. 2006 à 13:50
si tu avais copié cette solution, j'aurais pu faire le test exact de suite.

je suppose que c'est avec un LockWindowsUpdate ou quelque chose dans ce goût-là.....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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

"
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 févr. 2006 à 19:50
çà marche chez moi.....










' =====

' Form1

' =====

'

'

Option Explicit

'

'

Private Sub Form_Load()

Call Hook(Text1.Hwnd)

End Sub

'

Private Sub Form_Unload(Cancel As Integer)

Call Unhook

End Sub

'

'

Public Sub RightClickDownForMenu()

Text1.SetFocus

PopupMenu MNU_POP

End Sub











' =======

' Module1

' =======

'

'

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

Private Const WM_RBUTTONDOWN As Long = &H204

'

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

If uMsg = WM_RBUTTONDOWN Then

Call Form1.RightClickDownForMenu

WindowProc = True

Else

WindowProc = CallWindowProc(LngPrevWndProc, hw, uMsg, wParam, lParam)

End If

End Function





<small> Coloration
syntaxique automatique [AFCK]</small>



et toi?
0
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 févr. 2006 à 12:14
faire un coller comment, c'est "coller" dans ton menu?

là on hook une seule txtbox..... désolé, je comprend pas ta phrase......
0
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 févr. 2006 à 20:44
dans le module on ajoute la déclaration du bouton gauche

Private Const WM_LBUTTONDOWN As Long = &H201



ensuite on modifie la fonction de Hook.

c'est à dire que si le bouton droit est enfoncé, on simule un gauche.

il ne reste plus qu'à coller le presse-papier par Text1.SelText = clipboard...... au click du menu

(testé avec une simple chaîne, nikel chez moi)




Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If uMsg = WM_RBUTTONDOWN Then

WindowProc = CallWindowProc(LngPrevWndProc, hw, WM_LBUTTONDOWN, wParam, lParam)

Call Form1.RightClickDownForMenu

Else

WindowProc = CallWindowProc(LngPrevWndProc, hw, uMsg, wParam, lParam)

End If

End Function





<small> Coloration
syntaxique automatique [AFCK]</small>




.... 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...



çà te va?

en l'attente
0
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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.
0
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Derniè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 ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 févr. 2006 à 12:46
http://www.mentalis.org/vbtutor/subclass.shtml

à ouvrir avec IE

++

PCPT [AFCK]
0
forrestier2003 Messages postés 11 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 1 mars 2006
17 févr. 2006 à 14:20
Merci.
0
Rejoignez-nous