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

Salvador Pozo salvador en conclase.net
Lun Mar 5 18:22:38 CET 2012


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


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