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

Salvador Pozo salvador en conclase.net
Dom Mar 4 14:53:53 CET 2012


El pasado 2012-03-03 13:54:01, clom escribió:
 
c> ...
c> Alguien tiene idea de como puedo hacer lo que quiero o por que no funciona lo que estoy intnetando? 

Hola:

Sólo se me ocurre que estés haciendo algo mal, porque yo lo he intentado y si me funciona (aunque reconozco que me ha costado un poco :))

Sigue un pequeño ejemplo:

----8<------
    HWND hctrl;
    // Declaraciones necesarias:
    static HDC hCompatibleDC;
    RECT re = {0, 0, 63, 19};
    HDC hDC;

    switch (msg)                  /* manipulador del mensaje */
    {
        case WM_CREATE:
           hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
           /* Insertar controles */
           hctrl = CreateWindowEx(
              0,
              "BUTTON",        /* Nombre de la clase */
              "Bitmap",        /* Texto del título */
              BS_BITMAP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 
              160, 69,         /* Posición */
              95, 24,          /* Tamaño */
              hwnd,            /* Ventana padre */
              (HMENU)ID_BOTON5,/* Identificador del control */
              hInstance,       /* Instancia */
              NULL);           /* Sin datos de creación de ventana */

           // Parte del código para crear un bitmap
           hDC=GetDC(hwnd);
           hCompatibleDC = CreateCompatibleDC(hDC);
           hBitmap = CreateCompatibleBitmap(hDC, 64, 20);
           SelectObject(hCompatibleDC, hBitmap);
           // Dibujar el botón:
           FillRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(WHITE_BRUSH ));
           FrameRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(GRAY_BRUSH ));
           Ellipse(hCompatibleDC, 20, 2, 44, 18);
           // Liberar los DCs
           ReleaseDC(0, hDC);
           DeleteDC(hCompatibleDC);

           SendMessage(hctrl, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
           return 0;
...
        case WM_DESTROY:
           // Al destruir el diálogo destruir el bitmap:
           DeleteObject(hBitmap);
...
----8<------

Para modificar el bitmap deberás volver a crear un DC compatible, seleccionar el bitmap en él, volver a dibujarlo y liberar el DC.

Supongo que habrá algunas diferencias entre este ejemplo y tu código.

Suerte, hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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