[C con Clase] Crear un Bitmap en tiempo de ejecucion y usarlo como fondo de un boton

Agustín Cota Reguero clom2002 en yahoo.es
Lun Mar 5 19:57:29 CET 2012


Hola Salvador, muchisimas gracias, ya está resuelto, faltaba  DeleteDC(hCompatibleDC) y era por eso por lo que no funcionaba. Lo de los dos bitmap es por que uno lo utilizo para pintar otras cosas en el fondo del dialogo. Ciertamente el que enviaba en el mensaje era el equivocado ya que yo dibujaba sobre el que terminaba en 1. Todo solucionado. Muchisimas gracias de nuevo. Cuando lo tenga terminado te mando el proyecto entero para que puedas ver que es lo que queria hacer exactamente ejecutandolo si quieres.



________________________________
 De: Salvador Pozo <salvador en conclase.net>
Para: cconclase en listas.conclase.net 
Enviado: Lunes 5 de marzo de 2012 18:22
Asunto: Re: [C con Clase] Crear un Bitmap en tiempo de ejecucion y usarlo como fondo de un boton
 
El pasado 2012-03-05 15:40:13, clom escribió:

c> Hola, he seguido el ejemplo que me has puesto, que basicamente era lo que estaba haciendo yo, pero sigue sin hacer nada. Solo veo una diferencia y es que tu lo haces en la gestión del mensage WM_CREATE y yo lo hago en el WM_INITDIALOG ya que el boton está en en un dialogo que abro con CreateDialogParam en unas ocasiones y en otras con DialogBoxParam (aunque esta vez probe con uno abierto con la primera de las dos). Te voy a poner el codigo que he usado a ver si ves algo que se me escape.

Hola:

Con estas cosas "básicamente igual" no es lo mismo que "igual". Has cometido un par de errores importantes.

(No he podido ejecutar el programa porque me faltan muchas definiciones y partes, pero no importa.)

Veamos la parte que nos interesa:

c>         case WM_INITDIALOG:
c>             hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
c> ...
c>             GetClientRect(hdwnd,&clien);
c>             hDC = GetDC(hdwnd);
c>             hDcmem = CreateCompatibleDC(hDC);
c>             hBitmap = CreateCompatibleBitmap(hDC,clien.right,clien.bottom);
c>             hCompatibleDC = CreateCompatibleDC(hDC);
c>             hBitmap1 = CreateCompatibleBitmap(hDC, 64, 20);
c>             SelectObject(hCompatibleDC, hBitmap1);                       <<(1)
c>             // Dibujar el botón:
c>             FillRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(WHITE_BRUSH ));
c>             FrameRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(GRAY_BRUSH ));
c>             Ellipse(hCompatibleDC, 20, 2, 44, 18);
c>             ReleaseDC(hdwnd,hDC);
c>             SelectObject(hDcmem,hBitmap);
c>             hpen = CreatePen(PS_SOLID,1,vistaprevia->GetColor());
c>             SelectObject(hDcmem,hpen);
c>             PatBlt(hDcmem,0,0,clien.right,clien.bottom,PATCOPY);
               DeleteDC(hCompatibleDC);   << (3)
c>             SendDlgItemMessage(hdwnd,IDC_BUTTON1_RESPUNTOPROP, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);<<(2)

Estás creando dos mapas de bits, aunque sólo usamos uno para el botón, el otro no sé para qué es.

Puesto que entiendo que el botón lo estamos dibujando en el DC hCompatibleDC (1), y que en este DC hemos seleccionado el mapa de bits hBitmap1, deberíamos usar ese mapa de bits para enviarlo al botón junto al mensaje BM_SETIMAGE, en lugar de hBitmap (2).

Es muy, pero que muy importante borrar el DC que hemos creado para modificar el bitmap usando DeleteDC (3). Si no se hace esto, el mapa de bits no se libera y no está disponible para el botón.

A ver ahora si te funciona.

Hasta luego.



-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120305/a31697b1/attachment.html>


Más información sobre la lista de distribución Cconclase