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

C++Builder Discussion :

Afficher un menu lors d'un click droit sur l'image


Sujet :

C++Builder

  1. #1
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut Afficher un menu lors d'un click droit sur l'image
    bonsoir,

    j'ai des images sur mon interface, j'aimerai ajouté un menu lorsque l'utilisateur fais un click droit sur l'image.
    Mais le pb c'est que j'utilise le bouton droit pour déplacer les images sur mon plan de travail.
    y-t'il une astuce pour ça.
    Merci

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Il faut que tu ajoute un composant TPopupMenu puis que tu l'associe avec ton composant TImage (tu as une propriete TPopupMenu sur le composant TImage), il ne te reste plus qu'a ajouter les choix de ton menu et remplir les fonction OnClick.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    comme j'ai dis j'utilse le bouton droit pour déplacé les images.
    donc quand je déplace l'image le menu s'ffiche et c'est génant.

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Tue peut mettre la propriété AutoPopup du Menu à false,
    détecter si ta souris bouge pendant un clic avec les evenement OnMouseDown, OnMouseMove et OnMouseUp, et si elle na pas bougé, dans OnMouseUp tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TPoint *Position = new TPoint;
    GetCursorPos(Position);
    MonPopupMenu->Popup(Position->x,Position->y) ;
    delete Position;
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Grillé! Donc pas la peine que je mette mon Post lol. J'avais la même idée que Mr Pottiez, c'est à dire travailler avec le OnMouseUp et les positions.

    Je vois qu'il y a un joli bout de code

    Bon Courage

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Comme le bouton droit est pris par le déplacement, il reste la possibilité d'utiliser conjointement les touches SHIFT, CTRL et ALT pour différencier d'autres actions. Tout dépend de la combinaison la plus logique à tes yeux.

    Par exemple :

    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
    26
    27
    28
    if(Button == mbRight)
        {
        if(Shift.Contains(ssShift))
            {
            //... ce qu'il faut pour déplacer les images
            }
        else
            {
            if(Shift.Contains(ssCtrl))
                {
                //un autre opération possible
                }
            else
                {
                if(Shift.Contains(ssAlt))
                    {
                    //encore une autre opération possible
                    }
                else
                    {
                    TPoint Ici;
                    //il faudra donc calculer les coordonnées écran pour le popup
                    //comme celà a été indiqué... 
                    PopupMenu->Popup(Ici.x, Ici.y); 
                    }
                }
            }
        }
    En fait, tu peux jongler comme bon te semble, y compris tenir compte d'une combinaison au niveau des touches mais dans ce cas ça devient difficile à gérer par l'utilisateur...

    A plus !

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    La solution de pottiez devrait être assez déroutante pour l'utilisateur peu habitué aux actions en temps différé.
    Mais en fait... pourquoi pas après tout ?

    A plus !

  8. #8
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    désolé j'ai fait une petite erreur, je n'utilise pas le bouton droit pour le déplacement mais plutôt le bouton gauche.
    Mais voici l'utilisation du mon bouton droit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::ImageMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     
     if ((Button == mbRight)&&(Shift.Contains(ssCtrl)))
     {
     ....  
      }
     
     if ((Button == mbRight)&&(Shift.Contains(ssAlt)))
     { ....
     }
     
    }
    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
    void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
     
     
    if (imageenfonce == 0) {
    TImage *Image = (TImage*)Sender;
     if(deplacer)
    {
     
    // bouton gauche
     
    } else {
           // bvouton droit
            }
     }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
     
     
    if (imageenfonce == 0) {
    // bouton gauche
     
    } else {
           //bouton droit 
    }
     
    }


    je nn sais pas ou je dois mettre le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PopupMenu1->AutoPopup = true;

  9. #9
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Fait tu quelques chose avec le bouton droit ? car si finalement tu ne fait rien avec le bouton droit tu peut simplement remettre la propriété AutoPopup à true, et ne plus mettre le ce code.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  10. #10
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    avce le bouton droit
    1- je trace les liens entre mes images
    2- (+clt) je sélectionne un chemin
    3- (+alt) je supprime un lien

  11. #11
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Dans ce cas, tu peut mettre une variable dans le .h de ta form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private :
    bool menu ;
    initialisé à false dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TForm1::TForm1(){
      menu = false ;
    }
    dans OnMouseDown tu la met à true si c'est un clic droit
    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
    void __fastcall TForm1::ImageMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     
     if ((Button == mbRight)&&(Shift.Contains(ssCtrl)))
     {
     ....  
      }
     
     if ((Button == mbRight)&&(Shift.Contains(ssAlt)))
     { ....
     }
     if (Button == mbRight){
       menu = true ;
     } 
    }
    Dans OnMouseMove tu met a false
    et dans OnMouseUp si c'est à true tu active le menu et tu met à false
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...OnMouseUp(...){
      if(menu == true){
        MonMenu->Popup ;
        menu = false ;
      }
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  12. #12
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    Pour la fonction POPUP il faut 2 entiers
    J'ai essayé avec les corrdonnées de la sourie (X,Y) le menu s'affiche selon les coordonnées de l'écran même chose si j'utilise les propriétés letf et top de l'image.

    Que faire ???

  13. #13
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Solution en message 4 :
    Citation Envoyé par pottiez
    Tue peut mettre la propriété AutoPopup du Menu à false,
    détecter si ta souris bouge pendant un clic avec les evenement OnMouseDown, OnMouseMove et OnMouseUp, et si elle na pas bougé, dans OnMouseUp tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TPoint *Position = new TPoint;
    GetCursorPos(Position);
      MonPopupMenu->Popup(Position->x,Position->y) ;
    delete Position;
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il faut déployer logiquement :

    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
    if(Button == mbRight)
        {
        if(Shift.Contains(ssCtrl))
            {
            //...je sélectionne un chemin
            }
        else
            {
            if(Shift.Contains(ssAlt)))
                { 
                //...je supprime un lien
                }
            else
                {
                //Aucune touche (CTRL ou ALT) n'est enfoncée donc...
                //...
                //PopupMenu->Popup(...);
                }
            }
        }
    A plus !

  15. #15
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    C'est vrai que c'est plus claire, j'ai repris bétement le code alors que j'aurais pu lui améliorer de cette manière
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  16. #16
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    ça ne marche pas ,
    j'ai le menu qui s'affiché qd je fais les liaisons
    et l'autre pb c'est que ça se généralise sur toutes les images et moi j'ai trois types d'images

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Tu peux éventuellement utiliser le Tag de chaque image pour y placer une valeur permettant de les différencier.

    Ici je suppose 3 types d'images (Tag = 0,1 ou 2) ainsi que l'existence de 3 PopupMenu :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    TImage *Cible = (TImage*)Sender;
    if(Button == mbRight)
        {
        if(Shift.Contains(ssCtrl))
            {
            }
        else
            {
            if(Shift.Contains(ssAlt))
                {
                }
            else
                {
                TPopupMenu *PpMenu = NULL;
                switch(Cible->Tag)
                    {
                    case 0 : PpMenu = PopupMenu1; break;
                    case 1 : PpMenu = PopupMenu2; break;
                    case 2 : PpMenu = PopupMenu3; break;
                    }
                if(PpMenu != NULL)
                    {
                    TPoint Pos;
                    GetCursorPos(&Pos);
                    PpMenu->Popup(Pos.x, Pos.y);
                    }
                }
            }
        }
    }
    Ca fonctionne chez moi, donc...

    A plus !

  18. #18
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    ça ne marche pas pour moi car j'ai besoin de l'action bouton droit seul car je fais de liens entre les images.
    Voici le code des évènements de la sourie :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
    void __fastcall TForm1::ImageMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     
    TImage *Image = (TImage*)Sender;
    eqchoisi = Image->Tag;
     
    deplacer = true;
    imageenfonce = Button;
    DeplX = X;
    DeplY = Y;
    if (Button == mbRight)
    {
     if(Shift.Contains(ssCtrl)) {
     tab[eqverif] = eqchoisi;
           if ( eqverif >= 1){ lien [tab[eqverif-1]][tab[eqverif]]=3;
                            lien [tab[eqverif]][tab[eqverif-1]]=3;}
     
       eqverif ++;
       lier();
     
     }
     else {
            if (Shift.Contains(ssAlt))
            { if (eqsupp >=2) eqsupp=0;
              supp[eqsupp]=eqchoisi;
              if ( eqsupp >= 1){ lien [supp[eqsupp]][supp[eqsupp-1]]=0;
                            lien [supp[eqsupp-1]][supp[eqsupp]]=0;
                           }
            eqsupp++;
            Form1->PaintBox1->Repaint();
            lier();
             }
     
          }
     
    }
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
     
     
    if (imageenfonce == 0) {
    TImage *Image = (TImage*)Sender;
     if(deplacer)
    {
     
    Image->SetBounds( Image->Left + X - DeplX,
    Image->Top + Y - DeplY,
    Image->Width,
    Image->Height);
     
    label[Image->Tag]->Left = Image->Left;
    label[Image->Tag]->Top = Image->Top -15;
    } else {
            Edit3->Text = Image->Tag;
            Edit2->Text = label[Image->Tag]->Caption;
            }
     }
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
     
     
     
     
    TImage *Image = (TImage*)Sender;
    if (imageenfonce == 0) {
    label[Image->Tag]->Left = Image->Left;
    label[Image->Tag]->Top = Image->Top -15;
            deplacer = false;
            lier();
     
            Application->ProcessMessages();
    } else {
            lien [eqchoisi][Image->Tag] = 1;
            lien [Image->Tag][eqchoisi] = 1;
            lier();
    }
    }

Discussions similaires

  1. Ne pas afficher le menu lors d'un click droit
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2013, 10h59
  2. [JList] afficher un menu lors d'un drag and drop
    Par skyangel dans le forum Composants
    Réponses: 4
    Dernier message: 12/03/2008, 15h16
  3. Réponses: 2
    Dernier message: 19/05/2006, 12h22
  4. Menu contextuel associé à un click droit
    Par myspirou dans le forum C++Builder
    Réponses: 1
    Dernier message: 21/04/2006, 16h19
  5. Afficher un menu contextuelle sur le click droit d'une image
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/01/2006, 12h19

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