Page 1 of 1

On Paint en Hmg.3.043

Posted: Fri Aug 31, 2012 5:38 pm
by Mario Mansilla
Hola :
He notado en el evento on paint un efecto de reflejo cuando se activa una ventana , efecto que no lo hacia en las versiones anteriores de hmg (041,042)
Les adjunto un ejemplo para que vean la diferencia al usarlo con la version actual y la inmediata anterior .
Saludos .
Mario Mansilla

Hello:
I notice in the event on paint mirror effect when activated a window into effect not earlier versions of hmg (041.042)
I attached an example so you can see the difference when used with the current version and the immediately preceding.

Re: On Paint en Hmg.3.043

Posted: Fri Aug 31, 2012 6:59 pm
by gfilatov
Mario Mansilla wrote: Hello:
I notice in the event on paint mirror effect when activated a window into effect not earlier versions of hmg (041.042)
I attached an example so you can see the difference when used with the current version and the immediately preceding.
Hello Mario,

IMHO You should add the following string on bottom of your Procedure ajustar

InvalidateRect (GetFormHandle(ThisWindow.Name), NIL ,.F.) // Invalidate all client area

similar to the new sample Wallpaper.

Hope that helps. :idea:

Re: On Paint en Hmg.3.043

Posted: Fri Aug 31, 2012 11:30 pm
by srvet_claudio
Hola Mario.

En las versiones anteriores el evento ON PAIT era de poca utilidad pues se ejecutaba después de pintar todos los controles y no tenia sentido dibujar sobre los button, grid, image, label, etc de la aplicación.

Actualmente el evento ON PAINT se ejecuta antes de que se pinten los controles, como debe ser y por eso actualmente se lo puede usar para pintar una imagen de fondo.

Deberías realizar el siguiente cambio en tu código para que no parpadee el ejemplo:

Code: Select all

.... ON SIZE Ajustar()  ON PAINT NIL    // Cambiar Ajustar() de ON PAINT a ON SIZE


   DEFINE IMAGE Image_1
        ROW    0                   // nuevo valor
        COL    0                    // nuevo valor
        WIDTH   Main.Width     // nuevo valor	
        HEIGHT  Main.Height    // nuevo valor
        PICTURE "Fondo.jpg"
        HELPID Nil
        VISIBLE .T.
        STRETCH .T.
        ACTION Nil
    END IMAGE



Image, button, grid, tab, etc. son controles estático de Windows y por lo tanto no es una buena medida manipularlos desde el evento ON PAINT, pues este se ejecuta cada vez que el sistema necesita repintar la ventana. El evento ON PAINT solo se debería usar para dibujar directamente en el área del cliente de la ventana.

En las versiones anteriores de HMG no parpadeaba tu ejemplo con el evento ON PAINT pues éste se ejecutaba después de que Windows pintase todos los controles e inclusive las ventanas, en otras palabras el ON PAINT no servía para el propósito para el que fue ideado, es decir que el usuario pudiese pintar directamente en la ventana y pudiese controlar los eventos de pintura de la aplicación.

Ahora en HMG 3.0.43 como se ejecuta primero ON PAINT al desaparecer la primera ventana Windows envía un mensaje WM_PAINT a tu aplicación para que repinte lo que existía debajo de la primera ventana, y vos al ajustar con el evento ON PAINT tu control Image haces que Windows encadene un segundo mensaje WM_PAINT por eso parpadea tu ejemplo.

No se si me hice entender, espero haberte ayudado.
Saludos,
Claudio Soto.

Re: On Paint en Hmg.3.043

Posted: Sat Sep 01, 2012 12:03 am
by danielmaximiliano
Hola Claudio :
Muy buena explicación, nunca se me dio por investigar la API de Windows, pero a medida que pasa el tiempo me va picando el bichito de curiosidad, estyo mirando mucho sobre MFC pero no encuentro la forma de PINTAR el Control FRAME.
mirando C:\hmg.3.0.43\SOURCE\c_frame.c
me encuentro que el control es un BOTON,

Code: Select all

hbutton = CreateWindowEx( WS_EX_TRANSPARENT , "BUTTON" , hb_parc(7) ,
		WS_CHILD | WS_VISIBLE | BS_GROUPBOX | BS_NOTIFY	 ,
		hb_parni(3), hb_parni(4) , hb_parni(5), hb_parni(6),
		hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL )
no vi un ejemplo claro de como hacerlo, es que mis aplicaciones utilizan FRAME y el color por defecto se pierde con los colores personalizados que utilizo de fondo.
tiene alguna sugerencia para mi?

Re: On Paint en Hmg.3.043

Posted: Sat Sep 01, 2012 11:58 am
by Mario Mansilla
Hola Claudio :
Muchas gracias por tus explicaciones . Realize las modificaciones que me sugeriste pero me encuentro con los siguientes problemas :
1 - Todos mis fmg estan hechos con el ide por lo cual solo me permite colocar valores numericos en las propiedades hight y wheight .
2 - Al colocar el procedimiento ajustar() en Onzise , cuando maximizo la pantalla no me cubre la imagen toda el area de la pantalla .

Saludos .
Mario Mansilla

Re: On Paint en Hmg.3.043

Posted: Sat Sep 01, 2012 1:47 pm
by srvet_claudio
Hola Mario.
Mario Mansilla wrote:Todos mis fmg estan hechos con el ide por lo cual solo me permite colocar valores numericos en las propiedades hight y wheight .
Poner en el control IMAGE el mismo WIDTH y HEIGHT que el de la ventana:

Code: Select all

   DEFINE IMAGE Image_1
        ROW    0
        COL    0
        WIDTH  690     // Valor igual al de la ventana madre
        HEIGHT 485     //  Valor igual al de la ventana madre 
        PICTURE "Fondo.jpg"
        HELPID Nil
        VISIBLE .T.
        STRETCH .T.
        ACTION Nil
    END IMAGE
Mario Mansilla wrote:Al colocar el procedimiento ajustar() en Onzise , cuando maximizo la pantalla no me cubre la imagen toda el area de la pantalla .
Agregar al evento OnMaximize:

Code: Select all

ON MAXIMIZE (Ajustar())
Saludos,
Claudio.

Re: On Paint en Hmg.3.043

Posted: Sat Sep 01, 2012 1:52 pm
by srvet_claudio
Hi all.
An small explanation of the change in the ON_PAINT event in the HMG 3.0.43:

With last versions of HMG, the ON_PAINT event draw above of controls and above of the DRAW_COMMANDS of HMG (_HMG_SYSDATA[ 102 ] events). It is for this reason that in the version 3.0.42 and later of HMG cannot set a background image in a window with the ON_PAINT event.

In HMG 3.0.43 the ON_PAINT event paints directly on the client area before paint of the controls, and before paint the DRAW_COMMANDS of HMG (_HMG_SYSDATA[ 102 ] events), giving the user an large power over paint of the windows.

Best regards,
Claudio Soto.

Re: On Paint en Hmg.3.043

Posted: Sun Sep 02, 2012 1:03 am
by srvet_claudio
danielmaximiliano wrote:Hola Claudio :
Muy buena explicación, nunca se me dio por investigar la API de Windows, pero a medida que pasa el tiempo me va picando el bichito de curiosidad, estyo mirando mucho sobre MFC pero no encuentro la forma de PINTAR el Control FRAME.
mirando C:\hmg.3.0.43\SOURCE\c_frame.c
me encuentro que el control es un BOTON,


Code:
hbutton = CreateWindowEx( WS_EX_TRANSPARENT , "BUTTON" , hb_parc(7) ,
      WS_CHILD | WS_VISIBLE | BS_GROUPBOX | BS_NOTIFY    ,
      hb_parni(3), hb_parni(4) , hb_parni(5), hb_parni(6),
      hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL )




no vi un ejemplo claro de como hacerlo, es que mis aplicaciones utilizan FRAME y el color por defecto se pierde con los colores personalizados que utilizo de fondo.
tiene alguna sugerencia para mi?
Hola Daniel.
Antes que nada perdón por la demora en contestar, es que estaba algo ocupado y quería al contestarte postear un ejemplo.

El control Frame (BS_GROUPBOX) es una ventana que pertenece a la clase Button, como está definida en HMG como una ventana transparente la forma mas sencilla de rellenarlo es pintando el área del cliente de la ventana madre, la otra forma de modificar las características de los controles es interceptando los mensajes WM_CTLCOLOR que envía Windows a la aplicación cuando un control esta por ser pintado pero esto obviamente es un poco mas complicado.

En el siguiente tópico dejé la primera solución espero que te sirva.
viewtopic.php?f=9&t=2456
Un abrazo,
Claudio.

Re: On Paint en Hmg.3.043

Posted: Mon Sep 03, 2012 12:34 pm
by Mario Mansilla
Hola Claudio :
Agregar al evento OnMaximize:

Code:
ON MAXIMIZE (Ajustar())

Ahora si funciona :) .
Seria tambien necesario agregar : InvalidateRect (GetFormHandle(ThisWindow.Name), NIL ,.F.) al procedimiento ajustar()

Saludos
Mario Mansilla :)

Re: On Paint en Hmg.3.043

Posted: Mon Sep 03, 2012 3:34 pm
by srvet_claudio
Mario Mansilla wrote:Seria tambien necesario agregar : InvalidateRect (GetFormHandle(ThisWindow.Name), NIL ,.F.) al procedimiento ajustar()
Hola Mario.
No es necesario agregar InvalidateRect al procedimiento ajustar(), InvalidateRect se usa solo para rutinas que pintan (dibujan) directamente en el área del cliente, lo único que hace es enviarle un mensaje a Windows para que este repinte la ventana inmediatamente.
Saludos,
Claudio.