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