Lors du clic droit sur une zone de texte, le menu contextuel spécifique à une zone de texte (Copier, Coller, ...) s'affiche automatiquement.
Si vous voulez afficher votre propre menu contextuel sur clic droit, le menu spécifique s'affiche d'abord et votre propre menu contextuel ne s'affichera qu'au deuxième clic droit. Inconfortable...
Pour empêcher l'affichage du menu contextuel spécifique, il faut que la propriété "Enabled" de la zone de texte soit mise à "False".
Mais alors, le contenu de la zone de texte apparaît en grisé.
Pour empêcher cela, utilisez l'API "LockWindowUpdate".
Puis remettez la propriété "Enabled" de la zone de texte à "True" et le tour est joué: votre menu contextuel personnalisé s'affichera sur un unique clic droit.
Source / Exemple :
Extrait de code: ...
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = vbRightButton Then
'Evite le texte grisé lors du passage à "disabled" en bloquant
'l'update de la zone de texte (voir l'API LockWindowUpdate).
LockWindowUpdate Text1.hWnd
'Une zone de texte "disabled" n'affichera pas le menu contextuel
Text1.Enabled = False
'Donne le temps à la ligne précédente de terminer son processus
DoEvents
'Affiche mon menu contextuel
PopupMenu mnuFichiers, , , , mnuOuvrir
'Remet "enabled" la zone de texte
Text1.Enabled = True
'Débloque l'update (voir l'API LockWindowUpdate)
LockWindowUpdate 0&
End If
End Sub
Private Sub Text2_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = 2 Then PopupMenu mnuFichiers, , , , mnuOuvrir
End Sub
Conclusion :
J'avais besoin de cette fonction pour une application particulière sur une zone de texte et une liste. Pour la liste, ça ne posait pas de problème; par contre, pour la zone de texte, ça marchait mal (besoin de 2 clics droits pour afficher mon menu contextuel). Je n'ai pas trouvé de code gérant ce problème sur Codes-Sources. Alors j'ai mis en place ce système qui marche bien. S'il y a des solutions plus simples ou différentes, je suis preneur. Par contre, si ça peut rendre service à l'un ou l'autre, c'est encore mieux.
23 sept. 2007 à 11:35
Source simple et efficace
Bonne continuation.
23 août 2005 à 09:47
est un bon exemple, suffit de ne pas lancer dans l'IDE mais seulement depuis exe compilé.
Par contre pour tes explications il y a erreur:
- Il n'y a absolument aucun hook.
- Utilise le sous classement de fenêtre (ici le controle EDIT est la cible sous classée).
- C'est toujours le EDIT qui reçoit les touches en premier, simplement il ne repasse pas l'event à sa procédure par défaut mais le traitement est fait par code dans la fonction de sous classement.
23 août 2005 à 08:55
Cette solution du "Enabled = False" n'est malheureusement pas fiable à 100%.
Réalisez une rafale de clic droits et vous verrez votre menu perso apparaître mais également de temps en temps le maudit menu standard de microsoft.
LA solution, car il en existe bien une, est nettement plus dangereuse.
Il est utilisé le hooking (API windows) qui intercepte le clic droit de l'utilisateur avant même que le textbox ne le reçoive.
Si j'ai dit "dangereuse", c'est que si vous arrêtezl'exécution de votre projet par le carré Stop de VB (autrement dit sans passer par l'événement Unload), vous aurez un violent message d'erreur et la fermeture immédiate de votre projet (si vous n'aviez pas sauvegarder c'est dommage...)
L'adresse de LA solution propre : http://www.vbfrance.com/forum.v2.aspx?id=57656
Merci à rivierem qui apporte une solution fiable à 100 % et le code complet d'un exemple.
2 août 2005 à 16:00
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Text1.Enabled = False
Text1.Enabled = True
PopupMenu mnuFichiers, , , , mnuOuvrir
end sub
J'ai pas testé ton code, mais je suis pas sur qu'il y ait de differences.
++
28 juil. 2005 à 20:08
Elle est sympathique ta source. J'apprécie sa simplicité (une dizaine de lignes) et les commentaires.
Bonne continuation à toi,
Cacophrène
PS : Certains veulent des chiffres. Il paraît que noter est une chose attendue. Alors c'est bien, ben donc : 8.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.