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 :

Pop-up en drag d'un listBox


Sujet :

C++Builder

  1. #1
    Membre Expert
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Par défaut Pop-up en drag d'un listBox
    Bonjour bonjour !!

    Je cherche a afficher un pop-up quand je passe au dessus d'un des elements de ma listBox ...


  2. #2
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Je sais que les TPopupMenu ont une méthode Popup prenant comme paramètre un X et Y de positionnement donc aucun problème pour faire afficher le menu mais si tu veux en plus que le menu change selon la ligne de la ListBox se trouvant sous le pointeur

  3. #3
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je n'ai pas compris tous les points de la question, mais à priori :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    switch(ListBox1->ItemAtPos(Point(X,Y), true))
        {
        case 0 :
        PopupMenu1->Popup(Left + ListBox1->Left + X,
                          Top + ListBox1->Top + Y);
        break;
        }
    Voir l'aide pour TListBox::ItemAtPos, en particulier pour le flag Existing.

    Je n'ai pas compris en particulier si tu exploites ceci dans la OnMouseDown ou la
    OnMouseMove... Le comportement est différent mais ça fonctionne dans les deux cas.

    A plus !

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans la OnMouseMove, le comportement est quand même assez pénible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void __fastcall TForm1::ListBox1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    TPoint P = Point(X,Y);
    P = ListBox1->ClientToScreen(P);
    switch(ListBox1->ItemAtPos(Point(X,Y), true))
        {
        case 0 : PopupMenu1->Popup(P.x, P.y); break;
        case 1 : PopupMenu2->Popup(P.x, P.y); break;
        case 2 : PopupMenu3->Popup(P.x, P.y); break;
        }
    }
    PS : Sur le coup..., j'avais complètement oublié ClientToScreen dans ma réponse précédente !!!

    A plus !

  5. #5
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il y a une autre possiblité en entrant un popupmenu dans les Objects du TStrings
    (Items du TListBox)... au cas où ta question irait dans le sens d'une construction
    dynamique, contexte pour lequel le switch n'est d'aucun secours !

    Dans ce cas :

    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
    void __fastcall TForm1::ListBox1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    TPoint P = Point(X,Y);
    P = ListBox1->ClientToScreen(P);
    int item = ListBox1->ItemAtPos(Point(X,Y), true);
    if(item != -1) // Pas de ligne égal -1 si Existing est true dans la ItemAtPos
        {
        TObject *PM = ListBox1->Items->Objects[item];
        if(PM != NULL)
            {
            if(PM->ClassNameIs("TPopupMenu"))
                {
                ((TPopupMenu*)PM)->Popup(P.x, P.y);
                }
            }
        }
    }
    L'affectation du popupmenu à Objects se fait simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox1->Items->Objects[0] = PopupMenu1;
    Ou bien monter les items de la listbox avec AddObject (TStrings)...

    A plus !

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello !

    Si ce que tu veux c'est juste un Hint qui va suivre la souris, changer en fonction de l'item sous la souris, et disparaitre quand tu vas sortir du Listbox , tu peux faire:
    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
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
      {
      fen_hint = new THintWindow(this);
      (void*)windowproc_orig = (void*)SetWindowLong(ListBox1->Handle, GWL_WNDPROC, (LONG)f_proc);
      }
     
    void __fastcall TForm1::ListBox1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
      {
      TPoint P = Point(X,Y);
      P = ListBox1->ClientToScreen(P);
      int item = ListBox1->ItemAtPos(Point(X,Y), true);
      if(item != -1) // Pas de ligne égal -1 si Existing est true dans la ItemAtPos
        {
        fen_hint->ActivateHint(TRect (P.x+16, P.y+16, P.x + 100, P.y+32), "Item" + IntToStr(item));
     
        TRACKMOUSEEVENT track = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, ListBox1->Handle, 0 };
        TrackMouseEvent(&track);
        }
      else
        fen_hint->ReleaseHandle();
      }
    avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LRESULT APIENTRY f_proc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
      {
      LRESULT retour = 0;
     
      // Désactive le Hint
      if (umsg == WM_MOUSELEAVE)
        Form1->fen_hint->ReleaseHandle();
      else
        retour = CallWindowProc(Form1->windowproc_orig, hwnd, umsg, wparam, lparam);
     
      return retour;
      }
    et ceci dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    THintWindow* fen_hint;  
    FARPROC windowproc_orig; // WNDPROC
    Voilou

    A++

  7. #7
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    1000 MERCI totoche76, j'avais besoin du Hint ...

    @+

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

Discussions similaires

  1. Drag & Drop sur ListBox avec format
    Par Pouknouki dans le forum VB.NET
    Réponses: 3
    Dernier message: 12/02/2012, 17h11
  2. Réponses: 1
    Dernier message: 21/06/2011, 01h18
  3. Drag and Drop ListBox -> HTML
    Par babar93 dans le forum Silverlight
    Réponses: 1
    Dernier message: 02/12/2009, 20h22
  4. Drag and Drop & listbox
    Par DarioP dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/11/2009, 15h55
  5. drag & drop treeview=>listbox
    Par sam_c_java dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/05/2009, 11h21

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