2009-05-09 12 views
5

Editar: Creo que el mensaje WM_CREATE no se envía durante la creación de ventanas secundarias (es decir, mi botón). Entonces, al llamar a SendMessage durante WM_CREATE, estoy enviando un mensaje a una ventana que aún no se ha creado. La solución por ahora es llamar a SendMessage() durante el mensaje WM_SHOWWINDOW. ¿Las ventanas secundarias envían mensajes WM_CREATE al momento de la creación?Mostrar un mapa de bits en una ventana de clase "BOTÓN" en WIN32

¿Por qué no se muestra el mapa de bits en el botón? El mapa de bits es de 180x180 píxeles.

Tengo un archivo de recursos con:

Bit BITMAP bit.bmp 

Luego de crear la ventana principal y una ventana secundaria "BOTÓN" con:

HWND b, d; 

b = CreateWindow(L"a", NULL, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, 0, 0, 
        hInstance, 0); 

d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 
       10, 10, 180, 180, b, 200, hInstance, 0); 

Luego, en mi procedimiento ventanas, envío las "BOTÓN" ventana el mensaje "BM_SETIMAGE" con:

HBITMAP hbit; 

case WM_CREATE: // It works if I change this to: case WM_SHOWWINDOW 

hbit = LoadBitmap(hInstance, L"Bit"); 

SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit); 

LoadBitmap() devuelve un identificador válido becaus e No devuelve NULL, y puedo mostrar el mapa de bits en el área del cliente utilizando la función BitBlt(). Entonces, o no estoy enviando el mensaje correctamente, o no estoy creando la ventana "BUTTON" correctamente.

¿Qué estoy haciendo mal?

Gracias!

Respuesta

4

El procedimiento de ventana para su clase de ventana "a" se llama con WM_CREATE cuando se crea una ventana de esa clase. Esto es durante su primera llamada al CreateWindow, que es antes de crear la ventana BUTTON secundaria. WM_CREATE significa "usted está siendo creado", no significa "se está creando un niño".

La solución es llamar a d = CreateWindow(L"BUTTON"...) en el controlador WM_CREATE para la clase "A":

case WM_CREATE: 
    d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 
        10, 10, 180, 180, hwnd, 200, hInstance, 0); 
    hbit = LoadBitmap(hInstance, L"Bit"); 
    SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit); 
+0

Gracias. Pensé lo mismo, pero cuando lo probé realmente no recibí ningún botón (ni siquiera un esquema). Lo único que ha funcionado ha sido colocar SendMessage() en WM_SHOWWINDOW. – tyler

+0

Apuesto a que es porque estás llamando d = CreateWindow (..., b, ...) en lugar de d = CreateWindow (..., hwnd, ...) - recuerda, estás dentro de la primera llamada a CreateWindow, por lo que b todavía no se ha asignado. – RichieHindle

+0

Guau, genial ... eso tiene sentido. Gracias hombre. – tyler

0

¿Cómo está verificando que WM_CREATE no recibe una llamada? Como BUTTON no es su clase de ventana (sino más bien definida por el SO) posee el WndProc para la ventana, no usted; por lo tanto, no se debe llamar al WM_CREATE para el botón en su código, porque BUTTON no es su clase.

Si desea recibir mensajes para el botón, deberá subclasificarlo y luego proporcionar su propio WndProc.

+0

Lo que traté de explicar en mi edición es que WM_CREATE sólo se envía a la ventana principal, no el botón. No estaba diciendo que WM_CREATE no se envíe. Pensé que tal vez mi WndProc recibiría mensajes WM_CREATE durante la creación de sus ventanas secundarias. Después de todo, recibe mensajes WM_COMMAND que se generaron desde su ventana de botón secundario. – tyler

Cuestiones relacionadas