[C con Clase] Dibujar Bitmap en Botón.

Juan Antonio jalr43 en hotmail.com
Sab Dic 16 21:40:46 CET 2006


Hola,

estoy creando una aplicación con una matriz de botones en la ventana principal para dibujar sobre el que se pulse un bitmap u otro en función del item seleccionado en un menú.

Si dentro del cuerpo del mensaje WM_CREATE hago lo siguiente sobre el botón se dibuja el bitmap correctamente:

hBitmapFondo = (HBITMAP)LoadImage(NULL, "fondo.bmp", IMAGE_BITMAP,
              0, 0, LR_LOADFROMFILE);
hBoton = CreateWindowEx( 0, "Button", "",
                 WS_CHILD | WS_VISIBLE | BS_BITMAP, 10, 10, ANCHO_CELDA, ANCHO_CELDA, hwnd, (HMENU)0, hInstance, NULL);
SendMessage( (HWND)hBoton, (UINT)BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmapFondo );

Pero lo quiero hacer es dentro de WM_CREATE entre otras cosas llamar a una función que me genere todos los botones en la ventana principal. Esta función tiene el siguiente prototipo:

void CrearEscenario( HWND hwnd, HINSTANCE hInstance, bool modo ); 

En el cuerpo de esta función lo más interesante de mostrar es:

for(columna = 0;columna < COLUMNAS;columna++)
      {
         for(fila = 0;fila < FILAS;fila++)
         {
            CreateWindowEx( 0, "Button", "",
                 WS_CHILD | WS_VISIBLE |WS_BORDER | BS_BITMAP,
                 columna*ANCHO_CELDA + xorigen, fila*ANCHO_CELDA + yorigen, 
                 ANCHO_CELDA, ANCHO_CELDA, hwnd, (HMENU)boton, hInstance, NULL);
                 
            boton += 1;
         }
      }

Los botones se generar correctamente. boton es una variable que empieza con el valor 200 y termina con el 596, ya que son 396 botones.

Entonces cuando se pulsa unos de estos botones pues se enviará el mensaje WM_COMMAND al CALLBACK y el handle (HWND) que recibe la función será el de botón pulsado creo. Dentro del mensaje WM_COMMANAD tengo lo siguiente:

case CM_DESTINO_JUGADOR:
    //un item del menú
    CheckMenuRadioItem(GetMenu(hwnd),CM_FONDO, CM_DESTINO_JUGADOR, CM_DESTINO_JUGADOR, MF_BYCOMMAND);
    break;
default:
    //compruebo si wParam tiene en valor entre 200 y 596, es decir, el mensaje procede de los botones
    if((wParam >= PRIMERA_CELDA)&&(wParam <= ULTIMA_CELDA))
     {
        //Compruebo si el menú tiene seleccionado el item fondo
        if(GetMenuState(GetMenu(hwnd),CM_FONDO,MF_BYCOMMAND) & MF_CHECKED)
        {
            //hwnd es el primer parámetro de la función CALLBACK
            SendMessage( (HWND)hwnd, (UINT)BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmapFondo );
        }
     }

Pues no funciona. Entoces si de la primera forma que he puesto funciona y de esta no será problema del primer parámetro que estoy pasando a SendMessage, pero yo pienso que cuando un botón de estos envía el mensaje WM_COMMAND el primer parámetro de la función CALLBACK es el handle del botón pulsado.

Lo único que se me ocurre para resolverlo es crear un array del tipo HWND con todos mis botones y usar como índice del array wParam.

Espero sus comentarios porque lo mismo de esta segunda también se puede hace pero se me está escapando algo.

Gracias de antemano.

Un saludo,
Juan Antonio.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20061216/249e66b0/attachment.html>


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