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


Urgente!! Una Tecla STOP

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

Moderador: latindeveloper

Urgente!! Una Tecla STOP

Notapor mcd17arg el Lun Oct 29, 2007 1:45 pm

Hola a todos!! necesitaria saber si alguien me puede ayudar con una duda que hasta ahora no puedo dilucidar.

Estoy haciendo una aplicacion grafica q genera figuras aplicando transformaciones lineales a otras(algo asi como parametros que generaran una figura).Esto se realiza cuando el usuario pulsa un boton play q tengo definido en una barra de herramientas. Entonces se ejecuta un algoritmo que tiene un ciclo do while principal.
la estructura es la siguiente


Código: Seleccionar todo
void CGraficadorView::OnToolPlay()
{
int i=1;
do{

     Transformar_Puntos(i);
      // aqui va el algoritmo generador de puntos que no lo escribo
      //para simplificar la lectura para que se comprenda la idea

     i++;
         
}while (i<=pDoc->Iteraciones);
}


Mi problema es que no se como programar una tecla stop o que el proceso que se inicio con la tecla play se pueda detener con la pulsacion de la tecla ESC (ESCAPE).
por favor si alguien me puede ayudar. Aprovecho para saludar al Administrador. Muchas Gracias por todoooo!!
marce.-
Ultima edición por mcd17arg el Mar Oct 30, 2007 10:18 pm, editado 1 vez en total
EL LOCO MARCE Y SU MALDITO LUNES...
mcd17arg
Usuario Activo
Usuario Activo
 
Mensajes: 20
Registrado: Mar Abr 20, 2004 4:29 am
Ubicación: salta capital

Re: Una Tecla STOP

Notapor ivancp el Mar Oct 30, 2007 10:17 pm

Tu programa espera que termine el bucle para seguir procesando los mensajes (mouse,teclado,refresco de pantalla, etc etc). es por eso que pareciera que esta colgado mientras corre el bucle.

Si no quieres utilizar hilos (que es una mejor alternativa) puedes capturar los eventos pendientes y enviarlos para que sean procesados, para ello puedes crear una funcion que haga esa tarea.

Código: Seleccionar todo
void ProcesarEventos( HWND hWnd_i )
{
   MSG stMsg = { 0 };
   while( PeekMessage( &stMsg, hWnd_i, 0, 0, PM_REMOVE ))
   {
       TranslateMessage( &stMsg );
       DispatchMessage( &stMsg );
    }
}


Entonces todo correrá normalmente mientras pase algo, por ejemplo presionar la tecla de escape. Para ello sigue los siguientes pasos.

1. Crear una variable en tu clase de nombre m_bEscPresionado, e inicializarlo en el contructor con false.
2. Agregar la funcion virtual PreTranslateMessage y escribir:

Código: Seleccionar todo
BOOL CGraficadorView::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if(pMsg->wParam==VK_ESCAPE)
            m_bEscPresionado = true;
    }   
    return CGraficadorView::PreTranslateMessage(pMsg);
}


Esto hará que levante el flag m_bEscPresionado.

3. Ahora solo tienes que modificar tu codigo como sigue:

Código: Seleccionar todo
void CGraficadorView::OnToolPlay()
{
int i=1;
do{

     Transformar_Puntos(i);
     //...
      i++;

      ProcesarEventos( this->GetSafeHwnd() );
      if(m_bEscPresionado)
      {
           m_bEscPresionado = false; // para la siguiente vez
           break;
       }
         
}while (i<=pDoc->Iteraciones);
}


4. Enjoy.

Tomado de http://www.codeproject.com/useritems/pe ... tricks.asp
ivancp
Programador Experimentado
Programador Experimentado
 
Mensajes: 316
Registrado: Jue Sep 06, 2007 12:57 pm

Urgente!! Una Tecla Stop

Notapor mcd17arg el Mar Oct 30, 2007 10:49 pm

Hola ante todo, y Muchas Gracias IVAN por tu respuesta pronta voy a probar lo que me pasaste :D esta muy interesante la alternativa de hilos.

:D
EL LOCO MARCE Y SU MALDITO LUNES...
mcd17arg
Usuario Activo
Usuario Activo
 
Mensajes: 20
Registrado: Mar Abr 20, 2004 4:29 am
Ubicación: salta capital

Re: Urgente!! Una Tecla Stop

Notapor mcd17arg el Mié Oct 31, 2007 11:15 am

Hola IVAN!! gracias por tu ayuda, probe el código y anda de maravilla, es justo lo que necesitaba. Lo unico que el código que pusiste tiene dos detalles que los publico aqui por si alguien lo necesita. El primero es que en el metodo ProcesarEventos no se invoca a PreTranslateMessage( &stMsg ); por lo tanto el código del mismo deberia ser:

Código: Seleccionar todo
void ProcesarEventos( HWND hWnd_i )
{
   MSG stMsg = { 0 };
   while( PeekMessage( &stMsg, hWnd_i, 0, 0, PM_REMOVE ))
   {
       PreTranslateMessage( &stMsg );   // sentencia correcta
       DispatchMessage( &stMsg );
    }
}


El segundo detalle es que el valor que debe retornar el metodo PreTranslateMessage() pertenece a la clase CView y no a CGraficadorView().... el código sería

Código: Seleccionar todo
BOOL CGraficadorView::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if(pMsg->wParam==VK_ESCAPE)
            m_bEscPresionado = true;
    }   
    return CView::PreTranslateMessage(pMsg); // sentencia correcta
}



Gracias por tu ayuda. Saludos!!
EL LOCO MARCE Y SU MALDITO LUNES...
mcd17arg
Usuario Activo
Usuario Activo
 
Mensajes: 20
Registrado: Mar Abr 20, 2004 4:29 am
Ubicación: salta capital


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado