Bonjour,
Je cherche a utiliser le d�filement vertical d'un scrollbox avec la molette de la souris, mais je n'ai rien trouv�.
Quelqu'un aurait une solution svp ?
Merci.
Version imprimable
Bonjour,
Je cherche a utiliser le d�filement vertical d'un scrollbox avec la molette de la souris, mais je n'ai rien trouv�.
Quelqu'un aurait une solution svp ?
Merci.
Le contr�le qui re�oit le MouseWeel est celui qui a le focus. Quel est le composant qui a le focus lorsque tu testes ?
je ne sais pas le scrollbox je suppose,
je souhaite faire d�filer le srollbox verticalement a l'aide du scroll de la souris, mais je ne sais pas comment m'y prendre.
Non, pas d'id�e ???
Il me faudrait juste obtenir les infos de la souris le "position" ou "delta wheel".
Si qqu'un connait �a ....
Merci.
Salut !
En fait, il y a peut-�tre une solution qui consisterait � intercepter les messages d�di�s au scrolling d'une fen�tre.
Il s'agit probablement de WM_HSCROLL et WM_VSCROLL.
Dans ce cas, �a pourrait se faire en modifiant la gestion des messages au niveau du gestionnaire ad-hoc de TForm.
Code:
1
2
3
4
5
6
7
8
9 protected: void __fastcall WMHScroll(TMessage &Message); void __fastcall WMVScroll(TMessage &Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_HSCROLL, TMessage, WMHScroll) MESSAGE_HANDLER(WM_VSCROLL, TMessage, WMVScroll) END_MESSAGE_MAP(TForm)
TODO ... ici je ne sais pas quelle serait la meilleure option !Code:
1
2
3
4
5
6
7
8
9 void __fastcall TForm1::WMHScroll(TMessage &Message) { // TODO... } void __fastcall TForm1::WMVScroll(TMessage &Message) { // TODO... }
A plus !
Merci pour ce code ,mais j'ai beau le tourner dans tous les sens je n'arrive a rien avec...
est ce bien du c++ ???
Ce ne serais pas du delphi plutot ?
Je ne suis pas un expert en prog alors si quelqu'un aurais une solution en C++ merci.
Je ne comprend pas pourquoi je n'arrive pas a trouver d'exemple, personne n'a fait �a auparavant ?
Pourtant �a devrais �tre quelque chose de logique et de facile de pouvoir bouger le scrollbox avec la roulette de la souris, c'est pr�vu pour, non ?
J'en d�duit donc que personne n'a utilis� le d�filement des ScroolBar d'un ScroolBox avec la roulette de la souris.
Ou m�me juste la roulette de la souris.
Dommage .... :? :cry::cry:
Hello,
Tu peux rajouter un composant TApplicationEvents sur ta fiche, et mettre sur le OnMessage:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void __fastcall TForm26::vAppEv1Message(tagMSG &Msg, bool &Handled) { if (Msg.hwnd == scrlbx1->Handle) // scrlbx1: Un TScrollBox par exemple { switch (Msg.message) { case WM_VSCROLL: // TODO... Caption = IntToHex((int)Msg.message, 8); break; case WM_HSCROLL: // TODO... Caption = IntToHex((int)Msg.message, 8); break; } } }
OK merci je vais essayer d'exploiter cette piste, merci.
Je vous tiens au courant.
@+
Salut, j'ai beau tourner le code dans tous les sens je n'y arrive toujours pas ...
Il me faudrais dans un premier temps obtenir le WheelDelta je pense mais je n'arrive pas a le r�cup�rer.
Alors si quelqu'un a une solution, je suis preneur.
Merci
Hello,
Sous Builder 6 et 2007 au moins, le TScrollBox te g�re la molette sans � avoir � rien faire d'autre, dans la mesure o� les contr�les ajout�s dans le TScrollBox n'interceptent pas eux-m�mes les �v�nements souris...
Par exemple, si le TScrollBox contient un TStringGrid, tu r�cup�res les �v�nements de la molette lorsque la souris est sur le fond du TScrollBox, mais pas lorsqu'elle est au dessus du TStringGrid...
Est-ce que c'est �a ton probl�me ? Qu'est ce que tu utilises comme contr�les ?
Salut totoche76 et merci de te pencher sur mon cas parce que je gal�re depuis un bon bout de temps, alors je t'explique:
J'ai une fenetre de taille fixe dans laquelle j'ai divers �l�ments (groupbox, images, etc) tout �a dans un ScrollBox afin de faire d�filer le contenu lorsque �a ne tiens plus dans une parti de la fenetre.
donc je souhaiterais r�cuperer les infos de la roulette de la souris afin de faire d�filer mon scrollBox (j'avais mis un ScrollBox pensant que ca ce g�rait tout seul, a tord malheureusement).
J'ai essay� diff�rentes choses que l'on m'a propos� au dessus mais je n'y arrive pas.
Donc j'attend impatiemment tes lumi�res stp.
Merci d'avance.
Info: je suis sous Code GearC++ Builder 2007
Hello,
2 m�thodes:
- Sous classement de fen�tre
Exemple, sur un TForm, avec.cpp:Code:
1
2
3 TScrollBox *vScrlbx1; TStringGrid *vGrd1; TButton *vBtn1;
A toi de rajouter autant de SetWindowLong(...) que tu as de contr�les qui interc�ptent la moletteCode:
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 #ifdef STRICT #define MYWNDPROC WNDPROC #else #define MYWNDPROC FARPROC #endif MYWNDPROC wpOrigWndProc = NULL; LRESULT APIENTRY WndProcScroll(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_VSCROLL || uMsg == WM_HSCROLL) { PostMessage(Form32->vScrlbx1->Handle, uMsg, wParam, lParam); return 0; } return CallWindowProc(wpOrigWndProc, hwnd, uMsg, wParam, lParam); } __fastcall TForm32::TForm32(TComponent* Owner) : TForm(Owner) { vBtn1Click(NULL); } __fastcall TForm32::~TForm32(void) { if (wpOrigWndProc != NULL) SetWindowLong(vGrd1->Handle, GWL_WNDPROC, (LONG)wpOrigWndProc); } void __fastcall TForm32::vBtn1Click(TObject *Sender) { if (wpOrigWndProc == NULL) { wpOrigWndProc = (MYWNDPROC)SetWindowLong(vGrd1->Handle, GWL_WNDPROC, (LONG)WndProcScroll); vBtn1->Caption = "ON"; } else { SetWindowLong(vGrd1->Handle, GWL_WNDPROC, (LONG)wpOrigWndProc); wpOrigWndProc = NULL; vBtn1->Caption = "OFF"; } }
- un Hook (SetWindowsHookEx), soit sur WH_GETMESSAGE en interceptant WM_VSCROLL et WM_HSCROLL, soit sur WH_MOUSE
Exemple:Code:
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 HHOOK hookGetMsg = NULL; LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { MSG* pCWP = (MSG*)lParam; if (pCWP->message == WM_VSCROLL || pCWP->message == WM_HSCROLL) if (pCWP->hwnd == Form32->vGrd1->Handle) PostMessage(Form32->vScrlbx1->Handle, pCWP->message, pCWP->wParam, pCWP->lParam); } return CallNextHookEx(hookGetMsg, nCode, wParam, lParam); } // Fin de MouseProc void __fastcall TForm32::vBtn2Click(TObject *Sender) { if (hookGetMsg == NULL) { hookGetMsg = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, 0, GetCurrentThreadId()); vBtn2->Caption = "ON"; } else { UnhookWindowsHookEx(hookGetMsg); hookGetMsg = NULL; vBtn2->Caption = "OFF"; } }
Bon OK ,je vais essayer d'adapter �a a mon code et je te dis je qu'il en ait parceque l� comme �a, :? �a ne me parle pas trop, je suis plut�t novice en prog.
Je te remercie et je te tiens au courant .
@+
J'ai essay� d'adapter la solution 2 (le HOOK) qui me semblait plus simple comme suit :
j'ai tout mis dans le .ccpCode:
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 HHOOK hookGetMsg = NULL; // LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { MSG* pCWP = (MSG*)lParam; if (pCWP->message == WM_VSCROLL || pCWP->message == WM_HSCROLL) if (pCWP->hwnd == Form1->ScrollBox1->Handle) PostMessage(Form1->ScrollBox1->Handle, pCWP->message, pCWP->wParam, pCWP->lParam); } return CallNextHookEx(hookGetMsg, nCode, wParam, lParam); } // Fin de MouseProc void __fastcall TForm1::vBtn2Click(TObject *Sender) { if (hookGetMsg == NULL) { hookGetMsg = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, 0, GetCurrentThreadId()); this->Button1->Caption="ON"; // vBtn2->Caption = "ON"; } else { UnhookWindowsHookEx(hookGetMsg); hookGetMsg = NULL; this->Button1->Caption="OFF";// vBtn2->Caption = "OFF"; } }
je n'ai pas de d�faut � la compilation mais il semble que le code n'est pas "op�rationel" car j'ai mis des point d'arr�t et rien ne se passe lorsque je bouge la roulette de la souris ...
Un id�e ?
il ne me manque pas un .h ou autre ?
Merci
L'id�e du machin: si le message arrive sur un des contr�les contenus dans le scrollbox, le rediriger vers le scrollbox. Donc il faut tester les handles des contr�les qui sont � l'int�rieur du scrollbox.Code:
1
2 if (pCWP->hwnd == Form1->ScrollBox1->Handle) PostMessage(Form1->ScrollBox1->Handle, pCWP->message, pCWP->wParam, pCWP->lParam);
L� tu ne rediriges rien...
Ah, pas sur d'avoir bien compris mais si je suis sur le scrollbox �a devrais fonctionner, non?
j'ai essay� �apour voir si �a fonctionnait sur la Form directement, mais non, pas mieux.Code:
1
2 if (pCWP->hwnd == Form1->ScrollBox1->Handle||Form1->Handle||Form1->ListBox1->Handle) PostMessage(Form1->ScrollBox1->Handle, pCWP->message, pCWP->wParam, pCWP->lParam);
Le probl�me que je vais avoir c'est que le contenu du scrollbox est g�n�r� apr�s la construction et est variable( ce sont des Classes d�riv�s de TImage dans des Classes d�riv�es de TGroupbox)
Mais bon ce que je ne comprends pas c'est que �a ne fonctionne pas lorsque ma souris est directement plac�e sur le Scrollbox.
Une id�e ?
:?Code:
1
2
3 if ((pCWP->hwnd == Form1->ScrollBox1->Handle) || (pCWP->hwnd == Form1->Handle) || (pCWP->hwnd == Form1->ListBox1->Handle))
Je pensait que c'�tait la m�me chose.
Enfin le r�sultat lui est le m�me car j'ai beau bouger la roulette de la souris sur tout les coins de ma Form du Scrollbox ou autre le programme ne s'arr�te jamais sur le point d'arr�t sur le ifaurais-tu une id�e.Code:
1
2
3 if ((pCWP->hwnd == Form1->ScrollBox1->Handle ) || (pCWP->hwnd == Form1->Handle) || (pCWP->hwnd == Form1->ListBox1->Handle))
Merci pour ton exemple totoche76 mais il utilise un TstringGrid qui g�re tout seul le scroll de la souris.
En dehors du TStringGrid le ScrollMouse ne fonctionne pas.
Ou alors je ne sais pas l'utiliser.:roll:
Alors si tu as autre chose...:cry: