Zone de texte : menu contextuel personnalisé sur clic droit

Soyez le premier à donner votre avis sur cette source.

Vue 14 598 fois - Téléchargée 1 390 fois

Description

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.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

SupSeb
Messages postés
9
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2007

Super, juste ce qu'il me fallait.
Source simple et efficace

Bonne continuation.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
http://www.vbfrance.com/forum.v2.aspx?id=57656
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.
oliviervillemain
Messages postés
4
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
25 août 2005

Salut,

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.
BasicInstinct
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Statut
Membre
Dernière intervention
20 octobre 2014
10
perso j'ai toujours fait

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.

++
Cacophrene
Messages postés
263
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008

Salut à toi !

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.