Foros del Web » Programación para mayores de 30 ;) » Programación General »

Problema con GDI

Estas en el tema de Problema con GDI en el foro de Programación General en Foros del Web. Holas; Tengo el siguiente problema: Estoy desarrollando una aplicación, el cual me grafica los datos en le form, de la siguiente manera: app.h Código: void ...
  #1 (permalink)  
Antiguo 14/05/2006, 14:19
 
Fecha de Ingreso: diciembre-2004
Ubicación: Iquique, Chile
Mensajes: 150
Antigüedad: 19 años, 5 meses
Puntos: 0
Pregunta Problema con GDI

Holas;

Tengo el siguiente problema:

Estoy desarrollando una aplicación, el cual me grafica los datos en le form, de la siguiente manera:

app.h

Código:
void graf(HDC hdc, HWND hwnd)
{
    hdc = GetDC(hwnd);
    SetMapMode(hdc,MM_ISOTROPIC);
    SetWindowExtEx(hdc,640,400,NULL);
    SetViewportExtEx(hdc,550,450,NULL);
    SetViewportOrgEx(hdc,150,0,NULL);
    :
    /* Resto de las funciones del dibujo
    MoveToEx, LineTo, etc..........
    */
    :
    ReleaseDC(hdc,hwnd);
}
graf.cpp

Código:
case WM_COMMAND:
    switch(LOWORD(wParam))
    {
      case 110:
         graf(hdc,hwnd);
      break;
    }
    break;
El asunto es que funciona a las mil maravillas, el problema es, cuando se sobrepone otra aplicación, el GDI se borra, no pasa así cuando realizo el gráfico en el evento Paint:

Código:
case WM_PAINT:
    hdc = BeginPaint(hwnd,&ps);
    // instrucciones del function graf(); quitando GetDC y ReleaseDC
    EndPaint(hwnd,ps);
    break;
De que forma puedo solucionar el problema????, desde ya Gracias...
  #2 (permalink)  
Antiguo 15/05/2006, 00:18
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
El detalle esta en los eventos.

Si usas una rutina de dibujo fuera del evento Paint.
sear dificil que se repita cuando se envia el mensaje WM_PAINT:
ya que tu rutina en este caso se actualizaria solo con WM_COMMMAND y especificamente con un ID 110. de otra forma nunca se ejecutara esta rutina.

Lo ideal es no usar rutinas de dibujado fuera de WM_PAINT:
Sin embargo supongo que se puede hacer con SendMessage, al boton que activa la rutina grafica.(Su pongo que es un boton el que activa la rutina grafica).

Pero yo haria esto:
bool garfActivo = false;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case 110:
{
RECT r;
grafActivo = true;
GetClientRect(hwnd, &r);
InvalidateRect(hwnd, &r, TRUE);
}
break;
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
if(grafActivo)//solo para las rutinas de el comando 110
{
// instrucciones del function graf(); quitando GetDC y ReleaseDC
}
EndPaint(hwnd,ps);
break;

De esta forma puedes poner cualquier otro tipo de rutinas en WM_PAIN, pero las de la funcion graf() solo se dubujaran si ya se ha activado grafActivo, con el comando 110.

No he probado esta rutina pero supongo que no tendras problemas con el sobreposicionamiento de ventanas, de ser asi podrias agregar a tu clase de ventana CS_HREDRAW | CS_VREDRAW.

Saludos.
  #3 (permalink)  
Antiguo 15/05/2006, 20:58
 
Fecha de Ingreso: diciembre-2004
Ubicación: Iquique, Chile
Mensajes: 150
Antigüedad: 19 años, 5 meses
Puntos: 0
Holas;

Gracias Nivel7, era eso, me falta bastante por aprender..... pero sigo adelante



Nos vemos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:01.