PDA

Ver la Versión Completa : Mensaje WM_DRAWITEM


bitERROR
03-03-2004, 23:52:54
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
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.