On Paint en Hmg.3.043
Moderator: Rathinagiri
-
- Posts: 269
- Joined: Wed Aug 13, 2008 2:35 pm
- Location: Córdoba - Argentina
On Paint en Hmg.3.043
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.
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
Re: On Paint en Hmg.3.043
Hello Mario,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.
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.
Kind Regards,
Grigory Filatov
"Everything should be made as simple as possible, but no simpler." Albert Einstein
Grigory Filatov
"Everything should be made as simple as possible, but no simpler." Albert Einstein
- srvet_claudio
- Posts: 2193
- Joined: Thu Feb 25, 2010 8:43 pm
- Location: Uruguay
- Contact:
Re: On Paint en Hmg.3.043
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:
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.
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.
- danielmaximiliano
- Posts: 2612
- Joined: Fri Apr 09, 2010 4:53 pm
- Location: Argentina
- Contact:
Re: On Paint en Hmg.3.043
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,
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?
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 )
tiene alguna sugerencia para mi?
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
-
- Posts: 269
- Joined: Wed Aug 13, 2008 2:35 pm
- Location: Córdoba - Argentina
Re: On Paint en Hmg.3.043
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
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
- srvet_claudio
- Posts: 2193
- Joined: Thu Feb 25, 2010 8:43 pm
- Location: Uruguay
- Contact:
Re: On Paint en Hmg.3.043
Hola Mario.
Saludos,
Claudio.
Poner en el control IMAGE el mismo WIDTH y HEIGHT que el de la ventana: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 .
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
Agregar al evento OnMaximize: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 .
Code: Select all
ON MAXIMIZE (Ajustar())
Claudio.
- srvet_claudio
- Posts: 2193
- Joined: Thu Feb 25, 2010 8:43 pm
- Location: Uruguay
- Contact:
Re: On Paint en Hmg.3.043
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.
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.
- srvet_claudio
- Posts: 2193
- Joined: Thu Feb 25, 2010 8:43 pm
- Location: Uruguay
- Contact:
Re: On Paint en Hmg.3.043
Hola Daniel.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?
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.
-
- Posts: 269
- Joined: Wed Aug 13, 2008 2:35 pm
- Location: Córdoba - Argentina
Re: On Paint en Hmg.3.043
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
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
- srvet_claudio
- Posts: 2193
- Joined: Thu Feb 25, 2010 8:43 pm
- Location: Uruguay
- Contact:
Re: On Paint en Hmg.3.043
Hola Mario.Mario Mansilla wrote:Seria tambien necesario agregar : InvalidateRect (GetFormHandle(ThisWindow.Name), NIL ,.F.) al procedimiento ajustar()
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.