évènement sur boutton

[Résolu]
Signaler
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour a tous,







Quelqu'un connai-t-il l'évènement produit lorsque l'utilisateur laisse le boutton cliqué enffoncé?





Merci d'avance.

35 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Tu peux essayer ca:
La fenêtre mère du bouton recoit WM_PUSH quand le bouton est appuyé ou relaché.
lParam spécifie de quel cas il s'agit (1=appui)

#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#include <windows.h>

HINSTANCE g_hInst;
HWND g_hWnd;
char g_szAppName[] = "ButtonNotify";
WNDPROC defBtnProc;

#define WM_PUSH (WM_USER + 1)

LRESULT CALLBACK BtnProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static BOOL bPushed FALSE, bCapture FALSE, bKbCapture = FALSE;
switch(uMsg)
{
case WM_LBUTTONUP:
case WM_LBUTTONDOWN:
bCapture uMsg WM_LBUTTONDOWN;
PostMessage(GetParent(hWnd), WM_PUSH, GetWindowLong(hWnd, GWL_ID), bCapture);
break;
case WM_KEYDOWN:
if(!bCapture && wParam == VK_SPACE)
{
bKbCapture = TRUE;
PostMessage(GetParent(hWnd), WM_PUSH, GetWindowLong(hWnd, GWL_ID), TRUE);
}
break;
case WM_KEYUP:
if(!bCapture && wParam == VK_SPACE)
{
bKbCapture = FALSE;
PostMessage(GetParent(hWnd), WM_PUSH, GetWindowLong(hWnd, GWL_ID), FALSE);
}
break;
case WM_MOUSEMOVE:
if(bCapture)
{
RECT rect;
GetClientRect(hWnd, &rect);
POINT pt = {(short)LOWORD(lParam), (short)HIWORD(lParam)};
if(PtInRect(&rect, pt))
{
if(!bPushed)
{
bPushed = TRUE;
PostMessage(GetParent(hWnd), WM_PUSH, GetWindowLong(hWnd, GWL_ID), TRUE);
}
}
else
{
if(bPushed)
{
bPushed = FALSE;
PostMessage(GetParent(hWnd), WM_PUSH, GetWindowLong(hWnd, GWL_ID), FALSE);
}
}
}
}
return CallWindowProc(defBtnProc, hWnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK AppWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hBtn, hEdit;
switch(uMsg)
{
case WM_PUSH:
SetWindowText(hEdit, lParam ? "Pushed" : "Unpushed");
break;
case WM_CREATE:
hBtn = CreateWindowEx(0, "Button", "Test", WS_VISIBLE | WS_CHILD, 0, 0, 100, 25,
hWnd, (HMENU)1000, g_hInst, 0);
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", 0, WS_VISIBLE | WS_CHILD, 110, 0, 100, 25,
hWnd, (HMENU)1001, g_hInst, 0);
defBtnProc = (WNDPROC)SetWindowLongPtr(hBtn, GWL_WNDPROC, (LONG_PTR)BtnProc);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


#ifdef _DEBUG
int main()
#else
#pragma comment(linker, "/entry:myWinMain")
int __stdcall myWinMain()
#endif
{
MSG msg;
g_hInst = GetModuleHandle(0);
WNDCLASSEX wcex;

memset(&wcex, 0, sizeof wcex);
wcex.cbSize = sizeof wcex;
wcex.lpfnWndProc = AppWndProc;
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.hInstance = g_hInst;
wcex.lpszClassName = g_szAppName;
wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
wcex.hCursor = LoadCursor(0, IDC_ARROW);

if(!RegisterClassEx(&wcex)) return 1;

g_hWnd = CreateWindowEx(0, g_szAppName, g_szAppName,
WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, g_hInst, 0);
if(!g_hWnd) return 1;

ShowWindow(g_hWnd, SW_NORMAL);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#ifdef _DEBUG
return (int)msg.wParam;
#else
ExitProcess(msg.wParam);
#endif
}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Il est préférable d'utiliser un CheckBox sous forme de bouton.
HWND hBouton=CreateWindowEx(0,"BUTTON","Bouton1",WS_VISIBLE | WS_CHILD | BS_PUSHLIKE | BS_AUTOCHECKBOX,100,100,30,20,hWnd,0,0,0);

Un clic sur ce bouton sera intercepté dans la procedure de la fenetre mère avec WM_COMMAND avec lParam contenant le HWND du bouton (comme les autres boutons). On récupere son état avec
LRESULT etat=SendMessage(hBouton,BM_GETSTATE,0,0);
l'action à executer dépendra de la valeur de "etat".
Dance ce cas pas besoin de sous-classement.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
HANDLE hTread;
DWORD id;

hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProc,
NULL,
0,
&id );

if(!hThread)
return ERREUR;

//ThreadProc
DWORD __stdcall ThreadProc(LPVOID lpParam)
{
//Action à effetuer
//Faire une boucle
}
if(!Meilleur("Joky")) return ERREUR;<
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Il y a WM_LBUTTONDOWN au moment ou le bouton est enfoncé, mais tu ne recois rien te signalant qu'il reste enfoncé. Par contre, tu peux le détecter car tu ne recois pas de WM_LBUTTONUP
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
merci, mais je n'arrive pas a coder cela, je met dans la boucle des
message , le message WM_LBUTTONDOWN et dedans un switch de
LOWORD(wParam) et un case 6 (car boutton 6) et dedans je met mon code,
mais rien ne se passe :s
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Va voir la description de WM_LBUTTONDOWN dans MSDN...
Il n'y a qu'un bouton gauche, je vois pas d'ou sort ton 6
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
ha non on c'est mal compris, moi je parle d'un bouton dans l'interface,
que l'utilisateur laisse appuyé, exemple (et c'est ce que je veu
faire), temps qu'il appuye sur le bouton, la piste audio avance.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Par bouton tu veux plutôt dire touche non ?

Donc si c'est ça :

BOOL bSixPressed = FALSE;

case WM_KEYDOWN:
if((char)wParam == '6')
bSixPressed = TRUE;
return 0;

case WM_KEYUP:
if((char)wParam == '6')
bSixPressed = FALSE;
return 0;
if(!Meilleur("Joky")) return ERREUR;<
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
non, exemple vous avez un bouton >> dans la fenetre, et temps que vous appuez dessus et bien la music accélère.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Ah ben c'est pareil que j'ai dit sauf que tu fais ça dans WM_COMMAND

if(!Meilleur("Joky")) return ERREUR;<
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Je crois qu'il va falloir sous classer le bouton, car on ne recoit de WM_COMMAND que quand on a relaché le bouton
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
heu oui, pouvez-vous être plus explicite ? ;) Oui on le recoi quand le bouton est relaché
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Je te prépare un exemple avec sous-classement, car je crois que t'es obligé de passer par la
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
merci bcp
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Ya un petit doute:
Quand tu clique tu le bouton, tu le maintiens cliqué et tu bouges la souris en dehors, le bouton n'est pls enfoncé jusqu'a ce que le souris revienne dessus.
Tu veux savoir quand il n'est visuellement plus enfoncé, ou quand il n'a pas la capture de la souris?
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
je le mentient cliqué sans bouger la souris en dehor
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Oui mais l'utilisateur de ton programme peut très bien bouger la souris
A moins que tu n'empêches de bouger la souris...
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
oui il peut le faire, mais l'action s'arrete quand il relache le bouton
et ou que la souris soit ben le bouton revien a sa position initiale.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
C'est vrai tu dois sous-classer ton bouton. En attendant l'exemple de vecchio56 voici une petite explication du sous-classement:
http://www.cppfrance.com/forum.v2.aspx?ID=561559

Pour empêcher le curseur de la souris de sortir du bouton pendant son appui, on utilise la fonction ClipCursor() dans la procédure de sous-classement:

case WM_LBUTTONDOWN:
RECT rect;
GetWindowRect(hwnd,&rect);
ClipCursor(&rect);
//... ton code ici
return 0;

case WM_LBUTTONUP:
ClipCursor(0);
//...to code ici
return 0;
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
j'avais commencé, mais je sais pas exactement ce que tu veux en fait. Déja je pense que c'est pas seulement la souris qu'on surveille, car ca peut aussi être le clavier qui est utilisé (on garde la touche espace enfoncée)
on a le message BM_GETSTATE pour savoir si le bouton est enfoncé, mais aucun moyen de savoir à quel moment l'état du bouton est modifié