Arret sur click d'un bouton

Résolu
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009
- 13 mars 2006 à 16:26
SAKingdom
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
- 14 mars 2006 à 22:49
Bonjour quelqu'un connaitrait il la fonction qui permet de verifier si un bouton a ete clique.
Je travail dans une dialogu box et je souhaite programmer une fonction du style:

case bouton1:
while (bouton2 n'est pas cliquer)
do
{
actions
}

Ce qui pourait par exemple correspondre a un chronometre.

Merci d'avance

13 réponses

SAKingdom
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
14 mars 2006 à 22:49
C'est pas nécessaire mais bon. Recherche sur MSDN CreateThread.
Je peut te donné un tit exemple:

unsigned _thread1 (LPVOID Param)
{
wprintf(L"Bonjour les amis");
return 0L;
}

puis dans une autre fonction ou dans WM_(Quelque chose) tu tape

HANDLE thread1;

thread1 = CreateThread(0, 0xFF, (LPTHREAD_START_ROUTINE)_thread1, 0, 0, 0); /* ceci est le minimum */

Ça aura comme effet de faire rouler la fonction _thread1 tout en fesant continuer ton programme.

Puis quand tu a fini avec le thread tu tape
DestroyHandle(thread1);

___________________________________________
Les plus grands esprits trouvent toujours une solution
3
cs_Joky
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
13 mars 2006 à 16:33
Sous classe ton bouton, et traite le message WM_LBUTTONDOWN

if(!Meilleur("Joky")) return ERREUR;<
0
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
13 mars 2006 à 17:11
Salut,

Il faut toujours éviter ce genre de boucle while(). Ca bouffe les ressources.

Il faut plutot intercepter l'événement de clic dans procedure de la boite de dialogue grace à WM_COMMAND.
Cet événment fournit le HWND et l'identificateur du controle cliqué
dans lParam et wParam respectivement. Voici un petit exemple utilisant
bouton1 comme identificateur:

case WM_COMMAND:

Select=LOWORD(wParam);

switch(Select)

{

case bouton1:

// Actions à faire...

return 0;

case .....

// ......

}

Pour faire un chronomètre, il est préférable d'utiliser le Timer de Windows avec les fonctions SetTimer(), KillTimer() et traiter le message WM_TIMER dans la procédure de ta boite de dialogue.
0
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

13 mars 2006 à 20:31
En fait je ne cherche pas a faire un chronometre mais a enregistre des donnes dans un fichier. C'est donnes arrive d'une carte d'aquisition. Ainsi en appuyant sur start je commence a enregister et en appuyant sur stop j'arrete (d'ou l'analogie avec le chrono).

J'ai utiliser ceci:

int end = 0;

case bouton1:
end = 0; // je reinitialise au cas ou je veux reprendre apres un arret
while (end = 0)
do
{
actions
}
return true

case buton2:
end = 1;
return true;

Pensez vous que cette solutions soit correct. Y a t'il quelque chose de plus smart?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

13 mars 2006 à 20:33
Ah oh fait j'aoublias je suis un rookies, alors "sous classe" un bouton kesako?
0
SAKingdom
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
14 mars 2006 à 01:28
Tu peu faire par exemple:

bool boutonclic = false;

switch(message)
{
case WM_COMMAND:
if((HWND)wParam == LeBouton)
boutonclic = true;
break;
}

et plus loin dans WM_PAINT ou dans un timer tu test:

if(boutonclic == false)
{
/* ce que tu doit faire */
}
else if(boutonclic == true)
boutonclic = false; /* pour réinitialiser */

Pour enregistrer dans un fichier c'est normalement fprintf ou pour l'API WriteFile
mais pour fprintf c'est:

FILE *file;

file = fopen("w", "fiichier.txt");
fprintf(file, "Bonjour les amis");
fclose(file);

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
14 mars 2006 à 16:39
Salut,

SAKingdom > Si LeBouton est un HWND alors il faut faire:

if((HWND)lParam == LeBouton)



Si c'est un identificateur, alors il faudra faire:

if(LOWORD(wParam)==LeBouton)



julienbornet > Pour comprendre le sous-classement, même si tu n'en as pas besoin, regarde cette page:

http://www.cppfrance.com/infomsg/PROBLEME-LISTBOX-CLIQUER-0_420877.aspx
0
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

14 mars 2006 à 17:13
Bon voila alors en fait j'ai tester ma structure et le probleme c'est que des que j'entre dans la boucle, cette derniere bouffe toute les resources et je ne peux plus rien faire donc impossible de cliquer et d'arreter la boucle.
J'ai eglement tester les structures que vous me propser mais le probleme c'est que je ne comprend pas trop comment l'implementer. Qu'est ce que le WM_PAINT. Je n'utilise que WM_INITDIALOG:
et WM_COMMAND: . J'ai aussi
essayer ceci dans une structure de test:



case IDC_BUTTON1:

if (end == 0)
{
number = number + 1;
}

return TRUE;



case IDC_BUTTON2:
end = 1;
SetDlgItemInt(hDlg, IDC_EDIT1, number,FALSE);

return TRUE;

le probleme vous l'orez comrpis c'est que si j'utilise cette structure dans mon prog en remplacant le number = number+1 par ma fonction fprintf, il faut que je clic sans arret sur le bouton. Hors les donnees de la carte d'aqui arrive toutes les milliseconde donc ...
C'est pourkoi je voulais utiliser le while. De plus ma structure test est la pour voir si je suis capable d'arreter une boucle si oui, alors je suis capable d'arreter l'aqui.
Voila j'espeer avoir ete clair

Merci de me faire par de vos idees
0
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

14 mars 2006 à 17:42
voici le code que j'ai implementer:



// Programmation of the button "Start aquisiation"
case IDC_BUTTON_STARTAQUI:

/*First we serify if the file have benne created*/
if (Crefil != 1)
{
strcpy(meserr,"Please create a file");
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, meserr);

return FALSE;
}

/*If the file is created, we inialize some variable and start the aquisition*/
end = 0;
fprintf(fic, "\n\n Data\n");
start = clock();

while (end == 0)
{
fprintf(fic, "\n ")

/*First we write the time of the point aquisition*/
elapsed = clock()- start;
rectime = elapsed*10e-4;
fprintf(fic, "Time:%f ",rectime);


/*Then if the absolut postion have been choose we cheked that we can wrote it and we wrote the data*/
if (IsDlgButtonChecked(Dlg, IDC_ABSOLUTEPOSITION) == BST_CHECKED)
{
error = cnc_absolute(FlibHndl,-1,4+4*MAX_AXIS,&Datapoint);

if (error == 0)
{ fprintf(fic, "x %8ld y %8ld z = %8ld b = %8ld c = %8ld ",Datapoint.data[0] ,Datapoint.data[1] ,Datapoint.data[2] ,Datapoint.data[3] ,Datapoint.data[4]);
}

else
{
GetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes ,50);
sprintf(meserr, "An error occured. Error Number : %i",error);
strcat (mes,meserr);
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes);
}
}


/*Then if the feedrate have been choose we cheked that we can wrote it and we wrote the data*/
if (IsDlgButtonChecked(Dlg, IDC_FEEDRATE) == BST_CHECKED)
{
error = cnc_actf(FlibHndl, &feedrate);

if (error==0)
{
fprintf(fic, "Feedrate = %ld ",feedrate);
}

else
{
GetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes ,50);
sprintf(meserr, "An error occured. Error Number : %i",error);
strcat (mes,meserr);
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes);
}
}



/*Then if the servoloadmeter have been choose we cheked that we can wrote it and we wrote the data*/
if (IsDlgButtonChecked(Dlg, IDC_SERVOLOADMETER) == BST_CHECKED)
{
error = cnc_rdsvmeter(FlibHndl, &maxaxis, Axisload);

if (error == 0)
{

for (i=0; i<maxaxis; i++)
{
fprintf(fic, "SvLM %c = %d ", Axisload[i].svload.name , Axisload[i].svload.data);
}
}

else
{
GetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes ,50);
sprintf(meserr, "An error occured. Error Number : %i",error);
strcat (mes,meserr);
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes);
}
}



/*Then if the spindle speed have been choose we cheked that we can wrote it and we wrote the data*/
if (IsDlgButtonChecked(Dlg, IDC_SPINDLESPEED) == BST_CHECKED)
{
error = cnc_acts(FlibHndl, &spindspeed);
// Test if there is an error
if (error == 0)
{
fprintf(fic, "Spindle speed = %ld ", spindspeed.data);
}

else
{
GetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes ,50);
sprintf(meserr, "An error occured. Error Number : %i",error);
strcat (mes,meserr);
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes);
}
}



/*Then if the spindle load meter have been choose we cheked that we can wrote it and we wrote the data*/
if (IsDlgButtonChecked(Dlg, IDC_SPINDLELOADMETER) == BST_CHECKED)
{

short num = 1;
error = cnc_rdspmeter(FlibHndl, 0, &num, Spindload);

if (error == 0)
{
fprintf(fic, "Spindle load = %d ", Spindload[1].spload.data);
}

else
{
GetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes ,50);
sprintf(meserr, "An error occured. Error Number : %i",error);
strcat (mes,meserr);
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes);
}
}



/*Then if the G Code have been choose we cheked that we can wrote it and we wrote the data*/
if (IsDlgButtonChecked(Dlg, IDC_GCODE) == BST_CHECKED)
{
error = cnc_rdseqnum(FlibHndl, &Numblock);

if (error == 0)
{
fprintf(fic, "N%ld\n",Numblock.data);
}

else
{
GetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes ,50);
sprintf(meserr, "An error occured. Error Number : %i",error);
strcat (mes,meserr);
SetDlgItemText(Dlg, IDC_TEXTBOX_AQUISITIONSTATUS, mes);
}
}



// Programmation of the button "Stop aquisiation"
case IDC_BUTTON_STOPAQUI:
end = 1;

return TRUE;
0
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

14 mars 2006 à 17:47
Ne soyez pas surpris si les commenatires sont en anglais c parce que je suis en stage pour un organisme ou la langue officielle est l'anglais du coup tout les documents doivent etre en anglais.
Comme vous pourvez le voir ma structure de test s'apparente tres bien a ceci dans sa forme generale.

De plus connaissez vous un moyen pour verifer toutes les check box d'un coup et ainsi dire :

case bouton start:

Verifie les donnees a enregister
While (bouton stop appyuer)
{
enregistre les donnees a aenregister
}

voila merci encore
0
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

14 mars 2006 à 17:47
Ne soyez pas surpris si les commenatires sont en anglais c parce que je suis en stage pour un organisme ou la langue officielle est l'anglais du coup tout les documents doivent etre en anglais.
Comme vous pourvez le voir ma structure de test s'apparente tres bien a ceci dans sa forme generale.

De plus connaissez vous un moyen pour verifer toutes les check box d'un coup et ainsi dire :

case bouton start:

Verifie les donnees a enregister
While (bouton stop appyuer)
{
enregistre les donnees a aenregister
}

voila merci encore
0
SAKingdom
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
14 mars 2006 à 20:52
racpp>oui tu a raison. Petite erreure. Désolé.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
julienbornet
Messages postés
99
Date d'inscription
jeudi 9 février 2006
Statut
Membre
Dernière intervention
2 février 2009

14 mars 2006 à 20:56
Bon voila je me suis renseigner et je penses que faire un thread qui commence au click du bouton start et qui s'arrete au click du bouton stop serait une bonne chose, le probleme c'est que je ne sais pas du tout comment implementer ca.

Qulequ'un pourait il m'aaiguiller
0