5

编辑:我认为在创建子窗口(即我的按钮)期间不会发送 WM_CREATE 消息。因此,通过在 WM_CREATE 期间调用 SendMessage,我正在向尚未创建的窗口发送消息。现在的解决方案是在 WM_SHOWWINDOW 消息期间调用 SendMessage()。子窗口是否在创建时发送 WM_CREATE 消息?

为什么按钮上不显示位图?位图为 180x180 像素。

我有一个资源文件:

Bit BITMAP bit.bmp

然后我创建主窗口和一个子“按钮”窗口:

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);

然后,在我的 Windows 程序中,我向“BUTTON”窗口发送“BM_SETIMAGE”消息:

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() 返回一个有效的句柄,因为它没有返回 NULL,而且我可以使用 BitBlt() 函数在客户区显示位图。所以我要么没有正确发送消息,要么没有正确创建“按钮”窗口。

我究竟做错了什么?

谢谢!

4

2 回答 2

5

WM_CREATE当创建该类的窗口时,将调用窗口类“a”的窗口过程。这是在您第一次调用 时CreateWindow,即在您创建子BUTTON窗口之前。 WM_CREATE意思是“你正在被创造”——它并不意味着“一个孩子正在被创造”。

解决方案是调用类“a”d = CreateWindow(L"BUTTON"...)的处理程序:WM_CREATE

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);
于 2009-05-09T23:00:50.620 回答
0

你如何验证WM_CREATE没有被调用?由于BUTTON不是您的窗口类(而是由操作系统定义),它拥有WndProc窗口,而不是您 - 因此WM_CREATE不应为代码中的按钮调用,因为BUTTON不是您的类。

如果你想接收按钮的消息,你必须继承它,然后提供你自己的WndProc.

于 2009-05-09T22:47:58.390 回答