On Paint en Hmg.3.043

Moderator: Rathinagiri

Post Reply
Mario Mansilla
Posts: 269
Joined: Wed Aug 13, 2008 2:35 pm
Location: Córdoba - Argentina

On Paint en Hmg.3.043

Post 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.
Attachments
Onpaint.rar
(122.62 KiB) Downloaded 357 times
User avatar
gfilatov
Posts: 1067
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: On Paint en Hmg.3.043

Post 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:
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: On Paint en Hmg.3.043

Post 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.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
User avatar
danielmaximiliano
Posts: 2612
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: On Paint en Hmg.3.043

Post 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?
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Mario Mansilla
Posts: 269
Joined: Wed Aug 13, 2008 2:35 pm
Location: Córdoba - Argentina

Re: On Paint en Hmg.3.043

Post 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
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: On Paint en Hmg.3.043

Post 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.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: On Paint en Hmg.3.043

Post 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.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: On Paint en Hmg.3.043

Post 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.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
Mario Mansilla
Posts: 269
Joined: Wed Aug 13, 2008 2:35 pm
Location: Córdoba - Argentina

Re: On Paint en Hmg.3.043

Post 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 :)
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: On Paint en Hmg.3.043

Post 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.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
Post Reply