julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 2 février 2009
-
13 mars 2006 à 16:26
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDerniè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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDerniè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
julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDerniè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]);
}
/*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);
}
/*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);
/*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);
}
/*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);
/*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);
}
julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDerniè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
}
julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDerniè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
}
julienbornet
Messages postés99Date d'inscriptionjeudi 9 février 2006StatutMembreDerniè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.