IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Menu contextuel appelé par 2 cliques de souris !


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut Menu contextuel appelé par 2 cliques de souris !
    Salut,

    J'ai implémenté dans mon contrôle dynamique un menu contextuel.

    Celui-ci marche bien, excepté que l'on ait obligé de cliquer 2 fois sur le bouton droite de la souris ! Au premier clique, c'est le menu contextuel standard de Windows qui est affiché !

    Pourquoi ?

    Voici le code, qui me semble tout à fait normal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      'Vérifiez si le bouton droit de la souris a été actionné.
      If Button = 2 Then PopupMenu mnuContext
    Merci par avance.

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    C'est quoi ton contrôle dynamique ?
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  3. #3
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Une zone de texte

  4. #4
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    En allant sur Google et en tapant "desactiver menu contextuel VB texte", le PREMIER lien sur lequel je tombe est celui ci :

    http://support.microsoft.com/kb/224302/fr

    tout y est expliqué, le code donné...
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  5. #5
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Ah oui en effet ...

    J'ai fait une recherche sur le forum mais pas... sur google !

    Merci.

  6. #6
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Salut,

    Je remonte le sujet car j'ai transformé le textbox en usercontrol, et le problème revient.

    Car, même si cela semble fonctionner avec l'environnement VB, ce n'est pas le cas dès que j'exécute de manière autonome le programme. Je me retrouve avec mes 2 menus contextuels.

    Mon contrôle est implémenté sur ma form par la méthode "load". Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        'Création du nouveau contrôle
        Load fldTextZone(intIndex)
     
        Set fldTextZone(intIndex).Container = FrScreenOut
     
        With fldTextZone(intIndex)
          'Désactive le menu contextuel Windows
          gHW = .hWnd
          Hook
    ...
      End With
    Le UnHook se trouve au niveau Terminate de la form.

    Que faire pour éliminer ce problème ?

    Merci par avance.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    bonjour,
    J'ai testé sur un UC et cela fonctionne parfaitrement, l'erreur que tu fait est de mettre cela dans ta forme.

    Dans le projet de ton UC ajouter un module.
    Mettre les fonctions et déclarations dans ce module

    et dans l'UC mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub UserControl_Initialize()
       gHW = Text1.hWnd
       Hook
    End Sub
     
    Private Sub UserControl_Terminate()
       Unhook
     
    End Sub
    Et le texte n'a plus de menu .
    A+

  8. #8
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Ok, merci de ta réponse.

    Malgré tout, un autre problème lié à celui-ci.

    Lorsque je rajoute les déclarations nécessaires au fonctionnement de la procédure hook :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Declare Function SetWindowLong Lib "user32" Alias _
       "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
       ByVal dwNewLong As Long) As Long
     
    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
    J'ai le message suivant :

    Des constantes, chaînes de longueur fixe, tableaux, types définis par l'utilisateur et instruction Declare ne sont pas autorisés comme membres public de modules d'objet
    Bon, alors, j'ai bien sûr supprimé les déclarations qui ne sont pas nécessaires dans UC. Voici ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Declare Function SetWindowLong Lib "user32" Alias _
       "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
       ByVal dwNewLong As Long) As Long
     
    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
     
     
    Const GWL_WNDPROC = (-4)
    Const WM_CONTEXTMENU = &H7B
     
    Dim lpPrevWndProc As Long
    Dim gHW As Long
     
    Sub Hook()
       lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
       AddressOf gWindowProc)
    End Sub
     
    Sub Unhook()
       Dim temp As Long
       temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
    End Sub
    Quelle est la syntaxe exacte pour que ça fonctionne ?

    Merci par avance.

  9. #9
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Essaye avec des Private Declare
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  10. #10
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Ok, c'est mieux, mais toujours un problème ;-)

    Maintenant, sur la fonction Hook :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Hook()
       lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf gWindowProc)
    End Sub
    j'ai le message suivant :

    Utilisation incorrecte de l'opérateur AddressOf
    S'il est incorrecte, par quoi le remplacer ?

  11. #11
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    AddressOf ne fonctionne que sur une sub écrite dans un module. C'est peut être çà le problème
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  12. #12
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Ok, c'est fort possible en effet. Mais je ne suis pas assez "calé" pour savoir comment le modifier...

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Tu n'a pas bien suivi les explications données précédamment...
    dans le projet de l'UserControl tu ajoute un Module et c'est dans ce module que tu doit mettre toutes les déclarations (variables, constantes et API)
    dans l'UC il ne doit y avoir que les lignes que j'ai mis en code dans mon poste précédant.
    Si tu ne sait pas comment faire pour ajouter un module.. cliquer sur le projet de l'UC , ensuite clic sur Projet.. ajouter module.
    Encore ceci, pour tester ton UC tu doit avoir 2 projets en même temps ( Un pour l'UC et un pour le tester), c'est ce que tu a fait ?
    A+

    Edit. toutes les variables, constantes et déclaration doivent êtres déclarées en Public, sinon elle ne sont visibles que dans le module.

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bon, je t'ai joint le zip avec les deux projets, comme cela tu aurra une idée de comment faire.
    A+
    Fichiers attachés Fichiers attachés

  15. #15
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Points : 145
    Points
    145
    Par défaut
    Ah, j'comprends mieux en effet...

    C'est impec. En fait, c'est bien le module que je n'avais pas ajouté dans le UC !!! Comme quoi, avec un exemple ;-).

    Un grand merci à toi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [QtGui] Menu contextuel masqué par un widget
    Par yottafr dans le forum PyQt
    Réponses: 4
    Dernier message: 07/10/2012, 22h10
  2. [AC-2007] Suppression d'un menu contextuel créé par macro
    Par spaiku dans le forum IHM
    Réponses: 2
    Dernier message: 10/11/2010, 10h29
  3. Menu contextuel/déroulant au click de la souris
    Par padawanette dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/04/2009, 10h15
  4. menu contextuel caché par une frame :cry:
    Par bidule_chose dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 30/10/2008, 14h11
  5. Ajouter un menu contextuel au bouton droit de la souris pour les textboxes
    Par LiNuXaDDiKt dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/01/2008, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo