Bonjour bonjour !!
Je cherche a afficher un pop-up quand je passe au dessus d'un des elements de ma listBox ...
![]()
Bonjour bonjour !!
Je cherche a afficher un pop-up quand je passe au dessus d'un des elements de ma listBox ...
![]()
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![]()
![]()
![]()
Salut !
Je n'ai pas compris tous les points de la question, mais à priori :
Voir l'aide pour TListBox::ItemAtPos, en particulier pour le flag Existing.
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; }
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 !
Salut !
Dans la OnMouseMove, le comportement est quand même assez pénible :
PS : Sur le coup..., j'avais complètement oublié ClientToScreen dans ma réponse précédente !!!
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; } }
A plus !
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 :
L'affectation du popupmenu à Objects se fait simplement :
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); } } } }
Ou bien monter les items de la listbox avec AddObject (TStrings)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part ListBox1->Items->Objects[0] = PopupMenu1;
A plus !
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:
avec ceci
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(); }
et ceci dans le .h
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; }Voilou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2THintWindow* fen_hint; FARPROC windowproc_orig; // WNDPROC
A++
1000 MERCI totoche76, j'avais besoin du Hint ...![]()
@+![]()
Partager