在WIN32中的“BUTTON”类窗口上显示位图

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

为什么按钮上没有显示位图? 位图是180×180像素。

我有一个资源文件:

Bit BITMAP bit.bmp 

然后我创建主窗口和一个子“BUTTON”窗口,其中包含:

 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()函数在客户区显示位图。 所以我要么没有正确发送消息,要么我没有正确创建“按钮”窗口。

我究竟做错了什么?

谢谢!

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

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

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

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

如果要接收按钮的消息,则必须将其子类化,然后提供自己的WndProc