C/Visual C - como evitar la pulsación repetitiva de un botón

 
Vista:

como evitar la pulsación repetitiva de un botón

Publicado por hola_a_todos (8 intervenciones) el 19/06/2007 16:09:16
Hola a todos:

En mi aplicación tengo un botón que inicia un proceso que requiere cierto tiempo, pongamos 5 segundos. Quiero evitar que el usuario pulse ese botón en esos 5 seg. ya que si es así repite el proceso y esto no es deseable. He encontrado una función del botón: EnableWindows(false) que impide o ignora los eventos del teclado o del ratón, pero sólo si no se trata del butón pulsado, es decir, pulsando otro botón puedo inahabilitar el que me interesa, pero no puedo inhabilitar el botón desde el manejador OnClick de ese botón.
Si me he enrollado mucho, pongo ahora el código para que se vea más claro:

Esto no funciona:

void CMiAplicacionDlg::OnClickMiBoton()
{
// TODO: Add your control notification handler code here
// m_anadir es la variable del botón
// lo que hay entre la primera y la última línea
// es solo a modo de prueba
m_anadir.EnableWindow(false);
Sleep(5000); // esto añado para que pueda volver a hacer click
CString cad1;
CString cad2;
CString cad3;
cad1="";
cad2="";
cad3="";
i++;
m_texto.GetWindowText(cad1);
cad2.Format("%i",i);
cad3.Format("%s %s",cad1,cad2);
m_texto.SetWindowText(cad3);
m_anadir.EnableWindow(true);
}

¿Alguién se encontro con este problema antes? ¿Podeís darme alguna idea?

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:como evitar la pulsación repetitiva de un botón

Publicado por fernando.gomez (1603 intervenciones) el 19/06/2007 22:42:46
A ver si entendí el problema. Lo que quieres es que una vez pulsado el ratón en el botón no se pueda volver a pulsar el botón. En otras palabras, no deberías recibir el mensaje WM_LBUTTONDOWN para ese botón hasta que la función termine de ejcutarse, ¿correcto?

Si sí, lo que te recomendaría es que reescribas el PreTraslateMessage y guardes alguna bandera como miembro de la clase (ya sea la derivada de CButton o en la ventana padre) para que mientras esté activada, hagas un PeekMessage del WM_LBUTTONDOWN (o los que te interese capturar) y simplemente lo deseches, pero que cuando esté desactivada siga su flujo normal. Así, activas la bandera al inicio del OnClickMiBoton y la desactivas al final, antes del return, y pos ya no recibirías en ese lapso el evento del click del botón.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:como evitar la pulsación repetitiva de un botón

Publicado por Nelek (816 intervenciones) el 21/06/2007 07:40:28
Otra opcion algo mas "chapucera" seria el tener una bandera que te determine si es posible hacer algo o no. Un timer con el tiempo de "clausura" que quieres y preguntar si la bandera esta a cierto o falso antes de ejecutar el codigo que quieres ejecutar, poniendo el timer al final del codigo de la funcion. Seria algo asi:

BOOL bIgnoraFuncion = FALSE;

void CMiAplicacionDlg::OnClickMiBoton()
{

if (bIgnoraFuncion)
return;

//Aqui haces lo que quieres hacer

bIgnoraFuncion = TRUE;
//Aqui activas el timer de los 5 segundos

return;
}

Y dentro del timer, al final de los 5 segundos... pones la bandera otra vez a false.


Lo ideal seria lo que te ha dicho fernando, pero eso requiere controlar bastante. Con esto sales del paso sin complicarte excesivamente. Depende de tu nivel y de las ganas de hacerlo como "dios manda elige una opcion u otra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:como evitar la pulsación repetitiva de un botón

Publicado por hola_a_todos (8 intervenciones) el 25/06/2007 10:21:19
Gracias por la respuesta. Lo he probado y va de maravilla. Como bien dices la otra solución, aunque más precisa, se escapaba un poco a mis conocimientos.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar