编辑:我认为在创建子窗口期间(即我的按钮)不会发送WM_CREATE消息。因此,通过在WM_CREATE期间调用SendMessage,我正在向尚未创建的窗口发送消息。现在的解决方案是在WM_SHOWWINDOW消息期间调用SendMessage()。子窗口是否在创建时发送WM_CREATE消息?
为什么按钮上没有显示位图?位图是180x180像素。
我有一个资源文件:
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()函数在客户区显示位图。所以我要么没有正确发送消息,要么我没有正确创建“BUTTON”窗口。
我做错了什么?
谢谢!
答案 0 :(得分:4)
当创建该类的窗口时,将使用WM_CREATE
调用窗口类“a”的窗口过程。这是在第一次调用CreateWindow
期间,这是在您创建子BUTTON
窗口之前。 WM_CREATE
表示“你被创造” - 这并不意味着“正在创造一个孩子”。
解决方法是在d = CreateWindow(L"BUTTON"...)
处理程序中为类“a”调用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);
答案 1 :(得分:0)
您如何确认WM_CREATE
未被调用?由于BUTTON
不是您的窗口类(而是由操作系统定义),因此它拥有窗口的WndProc
,而不是您 - 因此不应调用WM_CREATE
中的按钮你的代码,因为BUTTON
不是你的类。
如果您想接收该按钮的消息,则必须将其子类化,然后提供您自己的WndProc
。