Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cwnd::settimer En Visual C++

Iniciado por pekesan, 15 de Marzo de 2004, 01:15:51 PM

« anterior - próximo »

pekesan

 Bueno el caso es que tengo la vista de mi aplicación y quiero que esa vista de refresque con una frecuencia determinada. Así que le pongo un timer en el constructor SetTimer(ID,FRECUENCIA,NULL) y con el cass wizard creo una función para mi clase vista para que captura el mensaje WM_TIMER que es el que genera el timer. Desde ahí, desde esa función quiero llamar a la función OnDraw de la vista, después de recalcular las posiciones de las figuras para que redibuje todo, pero el caso es que no hay tu tía y parece que no entra siguiera en ese manejador de WM_TIMER, la pregunta es sí ¿se puede hacer eso?¿lo hago mal? ¿o  que?

Pong un poco del codiguillo

CCode_exampleView::CCode_exampleView()
{
   //En la creación fijo la función temporizadora
   //que cada cierto tiempo realizará la actualización
   //de las posiciones y el redibujo
   //Especificando NULL al final le decimos a la aplicación
   //que pase le mensaje la función OnTimer de
   //esta misma clase
   SetTimer(MAIN_TIMER,PERIODO,NULL);

}

Eso es donde fijo el timer, y luego os paso la función OnTimer que se supone que es el manejador.

void CCode_exampleView::OnTimer(UINT nIDEvent)
{
   // TODO: Add your message handler code here and/or call default
   
   //Obtenemos el documento relacionado
   CCode_exampleDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   pDoc->i_Iteraciones=pDoc->i_Iteraciones+PERIODO;
   
   //Comprobamos si se ha cumplido el ciclo
   if ((pDoc->i_Iteraciones%INTERVALO)==0)
   {
      //Se ha cumplido, aumentamos la velocidad
      //y ponemos iteraciones a 0
      pDoc->i_Velocidad++;
      pDoc->i_Iteraciones=0;
   }

   
   //Calculamos las nuevas posiciones de los enemigos
   //y de el jugador
   pDoc->jugador->CalcularNuevaPosicion(pDoc->i_Velocidad);

   for (int i=0;i   {
      pDoc->v_Enemigos->CalcularNuevaPosicion(pDoc->i_Velocidad);
   }

   //Calculamos si se ha producido la colision
   if (Collision(pDoc->jugador,pDoc->v_Enemigos));

   CDC *pDC=GetDC();
   OnDraw(pDC);
   
   CView::OnTimer(nIDEvent);

}

Pues eso, a ver si me echaís una manilla que esto me anda volviendo loco (nooo) , gracias por adelantado

Pazzzzzzzzzzzz



Zaelsius

 Hola, a simple vista parece todo correcto. Ya que dices que ni siquiera recibes eventos WM_TIMER, deberias tener en cuenta la ID estás asignando a tu temporizador, ya que debe ser un número positivo distinto de cero(1,2,..). Quizá

Prueba con esto a ver si sigue sin responder:

Citar
SetTimer(1,PERIODO,NULL);

Tambien tienes un sencillo ejemplo de código de temporizadores en el código de la semana Ghost. Aunque es Win32, el trabajo con tiempos es exactamente igual que en MFC.

Saludos

pekesan

 Pues el caso es que si hago directamente SendMessage(WM_TIMER) si que entra en la función pero al hacer SetTimer() que es función miembro de la vista parece que no pilla y eso que desde el class wizard especifique precisamente que añadiera el manejador para ese tipo de mensaje, ¿no manda SetTimer un WM_TIMER? Toda la ayuda que he podido leer me confirma mi código pero sigue sin funcionar, salvo que mande el mensaje lo mande directamente, así que no sé que puede ser, quizás el mensaje sea cogido por otra clase pero según el MSN

If this parameter is NULL, the WM_TIMER messages are placed in the application's message queue and handled by the CWnd object. (eso pare especificar el tercer parámetro de SetTimer).

A ver si alguno se le ocurre algo  porque esto es para  (nooo)  (grrr)


pekesan

 Bueno,para el que esté interesado en el asunto, he encontrado la solución o mas bien una forma de que funcione, por lo visto no me pillaba el Timer porque estaba en el constructor así que lo he puesto en el manejador del mensaje Nuevo_juego y todo bien. Espero que mi investigación sirva a alguno.


PAzzzzzzzzzzzzzzzzzz







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.