Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:
Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro

Impedir la pulsación repetitiva de un boton

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Impedir la pulsación repetitiva de un boton

Notapor hola_a_todos el Mar Jun 19, 2007 9:30 am

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 :?:
hola_a_todos
Novato
Novato
 
Mensajes: 8
Registrado: Vie May 04, 2007 12:05 pm

Re: Impedir la pulsación repetitiva de un boton

Notapor latindeveloper el Mar Jun 19, 2007 7:53 pm

Hola,

te sugiero que utilices un "timer" o cronometro:

1. Agregar un evento para el mensaje WM_TIMER, eso creará una funcion algo similar a:

Código: Seleccionar todo
CTuDialogo::OnTimer(int idevent)
{
     CDialog::OnTimer(...);

}


2. En la funcion OnInitdialog de tu dialogo agregale la siguiente linea para inicializar el timer.

Código: Seleccionar todo
CTuDialogo::OnInitDialog()
{
     SetTimer(102/*Id del Evento*/, 1000*5 /*Tiempo*/);
     return TRUE;
}


Esa instruccion invocará a la funcion OnTimer cada 1000*5 milesegundos (1000 milisegundos = 1 segundo), y le pasará 102 como parametro al timer...

3. Ahora solo queda escribir el codigo que necesitas cuando termine el tiempo:

Código: Seleccionar todo
CTuDialogo::OnTimer(int idevent)
{
     if(idevent == 102)
     {
          KillTimer(102); //Para que no vuelva a suceder

          //Aca puedes copiar  el codigo
          //que realiza la tarea que estabas explicando
   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);
     }

     CDialog::OnTimer(...);
}


Trate de explicar lo mejor posible.... espero te sirva.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados