Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Manejo Evento Paint en Win32

Estas en el tema de Manejo Evento Paint en Win32 en el foro de C/C++ en Foros del Web. Holas; Tengo la siguiente duda, manejo las funciones TextOut, FrameRect y fillRect, estos dos últimos los utilizo para el fondo a modo de presentación. Tengo ...
  #1 (permalink)  
Antiguo 23/12/2006, 16:17
 
Fecha de Ingreso: diciembre-2004
Ubicación: Iquique, Chile
Mensajes: 150
Antigüedad: 19 años, 4 meses
Puntos: 0
Manejo Evento Paint en Win32

Holas;

Tengo la siguiente duda, manejo las funciones TextOut, FrameRect y fillRect, estos dos últimos los utilizo para el fondo a modo de presentación.

Tengo dos botnoes, en el primero escribo un string "123123" y el segundo borro ese string.

Ahora, luego de borrar, no es posible escribir nada en las coordenadas que especfico en RECT, les coloco el código para que vean lo que trato de hacer, perfectamente puedo utilizar static con SetBkMode a TRANSPARENT y ajustando su posición con el fondo de colores de acuerdo al tipo de resultado, pero quiero disminuir código hecho. Esta realizado con Dev-C++, SO XP.

Código PHP:
#include <windows.h>
//
    
HWND hwnd;
    
HINSTANCE inst;
//
LRESULT CALLBACK WindowProcedure (HWNDUINTWPARAMLPARAM);
void fondo(HDCHWND);
void ver(HDCHWND);
void borrar(HDCHWND);

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    
HINSTANCE hPrevInstanceLPSTR lpszArgumentint nFunsterStil)
{
    
HWND hwndMSG messagesWNDCLASSEX wincl;
    
//
    
wincl.hInstance hThisInstance;
    
wincl.lpszClassName szClassName;
    
wincl.lpfnWndProc WindowProcedure;      /* This function is called by windows */
    
wincl.style CS_DBLCLKS;                 /* Catch double-clicks */
    
wincl.cbSize sizeof (WNDCLASSEX);
    
//
    
wincl.hIcon LoadIcon (NULLIDI_APPLICATION);
    
wincl.hIconSm LoadIcon (NULLIDI_APPLICATION);
    
wincl.hCursor LoadCursor (NULLIDC_ARROW);
    
wincl.lpszMenuName NULL;                 /* No menu */
    
wincl.cbClsExtra 0;                      /* No extra bytes after the window class */
    
wincl.cbWndExtra 0;                      /* structure or the window instance */
    //
    
wincl.hbrBackground = (HBRUSHGetStockObject(WHITE_BRUSH);
    if (!
RegisterClassEx (&wincl))
        return 
0;

    
/* The class is registered, let's create the program*/
    
hwnd CreateWindowEx (
           
0,                   /* Extended possibilites for variation */
           
szClassName,         /* Classname */
           
"Windows App",       /* Title Text */
           
WS_VISIBLE|WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX,
           
CW_USEDEFAULT,       /* Windows decides the position */
           
CW_USEDEFAULT,       /* where the window ends up on the screen */
           
544,                 /* The programs width */
           
375,                 /* and height in pixels */
           
HWND_DESKTOP,        /* The window is a child-window to desktop */
           
NULL,                /* No menu */
           
hThisInstance,       /* Program Instance handler */
           
NULL                 /* No Window Creation data */
           
);
    
ShowWindow (hwndnFunsterStil);
    while (
GetMessage (&messagesNULL00))
    {
        
TranslateMessage(&messages);
        
DispatchMessage(&messages);
    }
    return 
messages.wParam;
}
//
    
HWND boton,goma,lblBOOL resp,eraser;
    
HBRUSH hbrushhcuadrohfondo1;
    
COLORREF cfondo1 RGB(173,202,241);
    
COLORREF cfondo2 RGB(221,236,255);
    
RECT rect3 = {170,249,404,269};
    
RECT rect31 = {171,250,403,268};
    
char *str "123123";
    
RECT r = {172,251,402,267};
//
LRESULT CALLBACK WindowProcedure (HWND hwndUINT messageWPARAM wParamLPARAM lParam)
{
    switch (
message)
    {
        case 
WM_CREATE:
             
boton CreateWindowEx(0,"button","Ver",WS_VISIBLE|WS_CHILD,10,10,
             
120,20,hwnd,(HMENU)100,inst,NULL);
             
goma CreateWindowEx(0,"button","Borrar",WS_VISIBLE|WS_CHILD,140,10,
             
120,20,hwnd,(HMENU)120,inst,NULL);
             
/*lbl = CreateWindowEx(0,"static","",WS_VISIBLE|WS_CHILD,171,250,100,19,
             hwnd,(HMENU)0,inst,NULL);*/
             
break;
        case 
WM_COMMAND:
             switch (
LOWORD(wParam))
             {
                    case 
100:
                         
resp true;
                         
GetClientRect(hwnd, &r);
                         
InvalidateRect(hwnd, &rTRUE);
                         break;
                    case 
120:
                         
eraser true;
                         
GetClientRect(hwnd,&r);
                         
InvalidateRect(hwnd,&r,TRUE);
                         break;
                    }
             break;
        case 
WM_PAINT:
             
HDC hdcPAINTSTRUCT ps;
             
hdc BeginPaint(hwnd,&ps);
                 
fondo(hdc,hwnd);
                 if(
resp) { ver(hdc,hwnd); }
                 if(
eraser) { borrar(hdc,hwnd); }
             
EndPaint(hwnd,&ps);
             break;
        case 
WM_DESTROY:
            
PostQuitMessage (0);
            break;
        default:
            return 
DefWindowProc (hwndmessagewParamlParam);
    }

    return 
0;
}
/*----------------- FUNCIONES ----------------------------*/
void fondo(HDC hdcHWND hwnd)
{
     
hbrush CreateSolidBrush(RGB(151,190,245));
     
hcuadro CreateSolidBrush(cfondo2);
     
hfondo1 CreateSolidBrush(cfondo1);
     
//dibujar formas
     
FrameRect(hdc,&rect3,hbrush);
     
FillRect(hdc,&rect31,hfondo1);
     
SelectObject(hdc,hbrush); DeleteObject(hbrush);
     
SelectObject(hdc,hfondo1); DeleteObject(hfondo1);
     }
//------
void ver(HDC hdcHWND hwnd)
{
     
SetTextColor(hdc,RGB(0,0,0));
     
SetBkMode(hdc,TRANSPARENT);
     
TextOut(hdc,172,251,str,strlen(str));
     }
//-------
void borrar(HDC hdcHWND hwnd)
{
     
/*char *str1 = "             ";
     SetBkColor(hdc,cfondo2);
     TextOut(hdc,174,251,str1,strlen(str1));*/
     
hfondo1 CreateSolidBrush(cfondo1);
     
FillRect(hdc,&rect31,hfondo1);
     
SelectObject(hdc,hfondo1); DeleteObject(hfondo1);
     } 
Les agradesco cualquier ayuda.
  #2 (permalink)  
Antiguo 24/12/2006, 11:17
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Manejo Evento Paint en Win32

En realidad si se redibuja, el problema es que tambien se borra.
esto es por que una vez que borras, la variable eraser siempre sera true y por tanto en WM_PAINT, siempre se borrara despues de pintar.

Última edición por Nivel7; 24/12/2006 a las 11:23
  #3 (permalink)  
Antiguo 24/12/2006, 17:42
 
Fecha de Ingreso: diciembre-2004
Ubicación: Iquique, Chile
Mensajes: 150
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: Manejo Evento Paint en Win32

Holas;

Eso estaba pensando , pero, como solucionar este problema. En todo caso no me he quedado hasta que me respondan, he probado algunas ideas, pero sin exito alguno, acepto sugerencias ya que sigo trabajando en esto.

Gracias, por responder
  #4 (permalink)  
Antiguo 25/12/2006, 06:21
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Manejo Evento Paint en Win32

valla pense que era facil.
Intenta esto:

Código:
case WM_COMMAND: 
             switch (LOWORD(wParam)) 
             { 
                    case 100: 
                         resp = true; 
                         eraser = false; /*agregado y necesario para evitar el   borrado justo despues de pintar.*/
                         GetClientRect(hwnd, &r); 
                         InvalidateRect(hwnd, &r, TRUE); 
                         break; 
                    case 120: 
                         eraser = true; 
                         resp = false;  //agregado solo por si acaso, jeje.
                         GetClientRect(hwnd,&r); 
                         InvalidateRect(hwnd,&r,TRUE); 
                         break; 
                    } 
             break;
  #5 (permalink)  
Antiguo 25/12/2006, 07:15
 
Fecha de Ingreso: diciembre-2004
Ubicación: Iquique, Chile
Mensajes: 150
Antigüedad: 19 años, 4 meses
Puntos: 0
De acuerdo Re: Manejo Evento Paint en Win32

Holas;

Nivel7, te agradesco tu ayuda al respecto, esto se me ocurrio hoy y funciona de la misma manera que tú método, habia hecho algo así, pero, lo hice mal :

Alejo :
Código PHP:
case WM_PAINT:
             
HDC hdcPAINTSTRUCT ps;
             
hdc BeginPaint(hwnd,&ps);
                 
fondo(hdc,hwnd);
                 if(
resp) { ver(hdc,hwnd); resp false; }
                 if(
eraser) { borrar(hdc,hwnd); eraser false; }
             
EndPaint(hwnd,&ps);
             break; 
Nivel7 :
Código PHP:
case WM_COMMAND
             switch (
LOWORD(wParam)) 
             { 
                    case 
100
                         
resp true
                         
eraser false/*agregado y necesario para evitar el   borrado justo despues de pintar.*/
                         
GetClientRect(hwnd, &r); 
                         
InvalidateRect(hwnd, &rTRUE); 
                         break; 
                    case 
120
                         
eraser true
                         
resp false;  //agregado solo por si acaso, jeje.
                         
GetClientRect(hwnd,&r); 
                         
InvalidateRect(hwnd,&r,TRUE); 
                         break; 
                    } 
             break; 
Me funciona bien al igual que tu solución, gracias amigo por responder

Nos vemos.
  #6 (permalink)  
Antiguo 26/12/2006, 03:00
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Manejo Evento Paint en Win32

Correcto, es la misma tarea solo modificas el lugar donde se hace.

muy bien...
Saludos.
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 13:56.