Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Mensaje WM_DRAWITEM (https://www.clubdelphi.com/foros/showthread.php?t=7996)

bitERROR 03-03-2004 23:52:54

Mensaje WM_DRAWITEM
 
Buenas, intento hacer que todos los controles de un formulario aparezcan de forma diferente, mediante el mensaje WM_DRAWITEM. He leído la ayuda de windows sobre este mensaje pero no logro aclararme.

No estoy muy al tanto de la captura de mensajes, pero tras hacer pruebas (no muy satisfactorias) con el mensaje WM_PAINT, descubrí el WM_DRAWITEM. Con WM_DRAWITEM puedo, por ejemplo, pintar un TBitBtn a mis anchas, algo bastante complicado utilizando WM_PAINT.

El caso es que funciona perfectamente cuando el padre del TBitBtn es el propio formulario, pero si el padre es un TPanel ya no se ejecuta. ¿Qué es lo que pasa, cómo lo hago? :(

Gracias de antemano y saludox :cool:

jachguate 04-03-2004 00:12:34

Cita:

Empezado por win32 sdk help
The WM_DRAWITEM message is sent to the owner window of an owner-drawn button

Yo digo que los BitBtn no son owner-drawn, aunque no tengo delphi a mano para probarlo. En general lo serán solo los items de un menú, de una lista desplegable, de un TreeView... es decir, aquellos objecots que son dibujados por su padre, y no por si mismos. En el caso de un Botón, o un Edit, un panel, etc. cada objeto es responsable de representarse en pantalla

Supongo que otra posibilidad es que estes capturando el mensaje desde el formulario, que al ser el parent del boton, puede recibirlo. Al ser el panel el parent, el formulario ya no recibirá el mensaje, sino el panel, por lo que el manejador del mismo debiera estar en el panel, y no en el formulario.

Esto podria funcionar, pero por supuesto no desmiente lo dicho al inicio. :rolleyes:

Saludos.
;)

roman 04-03-2004 00:24:54

Revisando por encima el código de TBitBtn parece ser que el control padre, al recibir el mensaje WM_DRAWITEM, manda el mensaje CN_DRAWITEM al control adecuado. En el caso de un BitBtn, al recibir CN_DRAWITEM simplemente llama a su método DrawItem que, desafortunadamente, no es virtual.

De cualquier forma quizá lo más adecuado sería heredar de TBitBtn una nueva componente y crearle un manejador de CN_DRAWITEM. De esta manera ya no importará en dónde se inserte el botón.

// Saludos

jachguate 04-03-2004 00:33:28

Pero para que tanta vuelta.... Simplemente redefiní el método paint, que será llamado cada vez que tenga que dibujarse el botón, y listo.


La franja horaria es GMT +2. Ahora son las 22:55:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi