• Lunes 29 de Abril de 2024, 08:07

Autor Tema:  Redibujar Pantalla  (Leído 3051 veces)

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Redibujar Pantalla
« en: Lunes 9 de Abril de 2007, 23:21 »
0
Saludos  :D ...

estoy haciendo una aplicacion que lee datos desde un archivo de texto (cerca de 900 datos)

y los debe graficar en una ventana a una velocidad constante , esta parte ya funciona

pero tengo algunos problemas cuando otra ventana pasa por encima de la ventana de mi aplicacion, porque borra parte de la grafica que dibuje (la parte por la que paso encima la otra ventana )<_<  creo que el problema es el redibujo de la ventana , pero no se como arreglarlo... alguien tiene alguna idea

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #1 en: Martes 10 de Abril de 2007, 00:09 »
0
Bueno, primero estas dibujanto en el WM_PAINT o en EL WM_ERASEBKGND, en cual de los 2 estas dibujando.

Debes tener en cuenta que cada vez que hagas algun movimiento en la ventana se va redibujar con WM_PAINT

claro esta si por algun motivo.. un loop o algo asi esta interfiriendo con el dibujado puedes usar  UpdateWindow();

dejanos ver tu funcion OnPaint a ver que estas haciendo.
Inside the code

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #2 en: Miércoles 11 de Abril de 2007, 23:09 »
0
Saludos :)

en realidad no estoy dibujando en el WM_PAINT o en EL WM_ERASEBKGND,
en lugar de eso, genere un timer, y cada que el timer expira leo un dato de mi vector y lo grafico, asi cada punto se grafica a un ritmo constante y la grafica se desplaza,

asi, en realizada estoy graficando en la funcion que llama el timer

void CALLBACK TimeProc(UINT uTimerID, UINT uMsg,
                        DWORD dwUser, DWORD dw1, DWORD dw2)
{
  /**
   * Timer Interruption
   */

   GraficaDatos();
}

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #3 en: Jueves 12 de Abril de 2007, 15:06 »
0
Como mandas a Graficar en Windows sin El evento paint. Que usas MFC , ATL o WTL??

Si estas usando una Funcion que se llama OnPaint  De Igual Manera estas usando WM_PAINT para dibujar sencillamente porque estas usando macros MessageMap.

algo como esto en WTL

MESSAGE_HANDLER(WM_PAINT, OnPaint)

Mustrame como estas dibujando.


De Igual manera en tu funcion  GraficaDatos(), Puedes usar UpdateWindow() para forzar a que se repinte la ventana.

no llames UpdateWindow() dentro del evento WM_PAINT porque generaria un loop
Inside the code

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #4 en: Viernes 13 de Abril de 2007, 00:57 »
0
bueno el WM_PAINT solo lo uso para posicionarme por primera vez cuando arranca el programa y de ahi solo grafico cada punto en cada llamada al timer

Código: Text
  1.  
  2.   case WM_PAINT:
  3.     hdc = BeginPaint(hWnd, &ps);
  4.     MoveToEx(hdc, Xg, Yg, (LPPOINT) NULL);
  5.     // TODO: Add any drawing code here...
  6.     EndPaint(hWnd, &ps);
  7.     break;
  8.  
  9.  
-

el codigo esta algo extenso asi que mejor lo adjunto
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #5 en: Sábado 14 de Abril de 2007, 03:25 »
0
:think:

Revise tu codigo
el hecho es que para pintar con secuencias esta perfecto. el problema es para mantener la ultima que trazaste.

Veras el WM_PAINT y EL WM_ERASEBKGND cada vez que se hace algo van a repintar la ventana.

Asi que deberas almacenar los ultimos puntos que graficaste para redibujarlos. Puedes hacerlos en Un DIB con BitBtl(); y repintarlo cuantas veces quieras. o mas sencillo es almacenandolos en un Array y dejarlo en el WM_PAINT, para que los pinte cada vez que ocurra un evento de repintado.

Espero y te sirva. Por favor si necestitas mas ayuda postea de nuevo.
Inside the code

ivancp

  • Miembro activo
  • **
  • Mensajes: 70
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #6 en: Miércoles 18 de Abril de 2007, 04:06 »
0
La solucion a tu problema es utilizar la tecnica de double buffering:

http://www.latindevelopers.com/vcpp/bitmap/doble-buffer/

El ejemplo de la pagina  utiliza MFC, es cuestion de acomodar el codigo para que puedas utilizarlo en tu aplicacion Win32 SDK.
ivancp                

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #7 en: Miércoles 18 de Abril de 2007, 20:08 »
0
ok, gracias por la informacion, voy a revisarlo,... :comp:

pero ahora que funciona la captura de datos y la graficacion a la velocidad que quiero, y que solo me falta el redibujo estaba pensando en utilizar DirectX, pero no se si se pueda hacer... :rolleyes:

ya antes juge un poco con el directx SDK, y aprendi a trabajar con sprites y con poligonos...  pero no se si se puedan dibujar lineas como lo hice con la aplicacion win32
 :unsure:

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #8 en: Miércoles 18 de Abril de 2007, 21:59 »
0
Cita de: "ivancp"
La solucion a tu problema es utilizar la tecnica de double buffering:

http://www.latindevelopers.com/vcpp/bitmap/doble-buffer/

El ejemplo de la pagina  utiliza MFC, es cuestion de acomodar el codigo para que puedas utilizarlo en tu aplicacion Win32 SDK.
Ya habia visto esta tecnica. hay varias de hecho. La mas sencilla es retornar 0 en MFC en el onEraseBnGnd.

Las tecnicas de doble buffer o Anti Flickering  sirven para eliminar el parpadeo de la pantalla. en el caso sencillo cuando WM_ERASEBKGND se pone vacio. no lo pinta y evita que ponga un fondo de color.
Asi hay varias.
Aqui hay una pagina que explica mejor.

http://www.catch22.net/tuts/flicker.asp
Inside the code

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Redibujar Pantalla
« Respuesta #9 en: Miércoles 18 de Abril de 2007, 22:01 »
0
Cita de: "allisap"
pero ahora que funciona la captura de datos y la graficacion a la velocidad que quiero, y que solo me falta el redibujo estaba pensando en utilizar DirectX, pero no se si se pueda hacer... :rolleyes:

 
ya que vas a graficar 2D Usa antigrain :
http://www.antigrain.com/
Inside the code