<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.2995" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hola,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>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ú.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Si dentro del cuerpo del mensaje WM_CREATE hago lo 
siguiente sobre el botón se dibuja el bitmap correctamente:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>hBitmapFondo = (HBITMAP)LoadImage(NULL, 
"fondo.bmp", 
IMAGE_BITMAP,<BR>              
0, 0, LR_LOADFROMFILE);<BR>hBoton = CreateWindowEx( 0, "Button", 
"",<BR>                 
WS_CHILD | WS_VISIBLE | BS_BITMAP, 10, 10, ANCHO_CELDA, ANCHO_CELDA, hwnd, 
(HMENU)0, hInstance, NULL);<BR>SendMessage( (HWND)hBoton, (UINT)BM_SETIMAGE, 
(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmapFondo );</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>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:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>void CrearEscenario( HWND hwnd, HINSTANCE 
hInstance, bool modo ); </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>En el cuerpo de esta función lo más interesante de 
mostrar es:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>for(columna = 0;columna < 
COLUMNAS;columna++)<BR>      
{<BR>         for(fila = 0;fila < 
FILAS;fila++)<BR>         
{<BR>            
CreateWindowEx( 0, "Button", 
"",<BR>                 
WS_CHILD | WS_VISIBLE |WS_BORDER | 
BS_BITMAP,<BR>                 
columna*ANCHO_CELDA + xorigen, fila*ANCHO_CELDA + yorigen, 
<BR>                 
ANCHO_CELDA, ANCHO_CELDA, hwnd, (HMENU)boton, hInstance, 
NULL);<BR>                 
<BR>            boton += 
1;<BR>         
}<BR>      }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>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.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>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:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>case CM_DESTINO_JUGADOR:<BR>    //un 
item del menú</FONT></DIV>
<DIV><FONT face=Arial size=2>    
CheckMenuRadioItem(GetMenu(hwnd),CM_FONDO, CM_DESTINO_JUGADOR, 
CM_DESTINO_JUGADOR, MF_BYCOMMAND);<BR>    
break;<BR>default:<BR>    //compruebo si wParam tiene en valor 
entre 200 y 596, es decir, el mensaje procede de los botones</FONT></DIV>
<DIV><FONT face=Arial size=2>    if((wParam >= 
PRIMERA_CELDA)&&(wParam <= ULTIMA_CELDA))<BR>     
{</FONT></DIV>
<DIV><FONT face=Arial size=2>        
//Compruebo si el menú tiene seleccionado el item fondo</FONT></DIV>
<DIV><FONT face=Arial size=2>        
if(GetMenuState(GetMenu(hwnd),CM_FONDO,MF_BYCOMMAND) & 
MF_CHECKED)</FONT></DIV>
<DIV><FONT face=Arial size=2>        
{<BR>            //hwnd 
es el primer parámetro de la función CALLBACK</FONT></DIV>
<DIV><FONT face=Arial size=2>        
    SendMessage( (HWND)hwnd, (UINT)BM_SETIMAGE, 
(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmapFondo 
);<BR>        }<BR>     }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>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.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>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.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Espero sus comentarios porque lo mismo de esta 
segunda también se puede hace pero se me está escapando algo.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Gracias de antemano.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Un saludo,</FONT></DIV>
<DIV><FONT face=Arial size=2>Juan Antonio.</FONT></DIV></BODY></HTML>