C 在“屏幕”上显示位图;按钮“;WIN32中的类窗口
编辑:我认为在创建子窗口(即我的按钮)期间不会发送WM_创建消息。因此,通过在WM_创建期间调用SendMessage,我将向尚未创建的窗口发送一条消息。目前的解决方案是在WM_SHOWWINDOW消息期间调用SendMessage()。子窗口是否在创建时发送WM_CREATE消息 为什么位图没有显示在按钮上?位图为180x180像素 我有一个资源文件,其中包含:C 在“屏幕”上显示位图;按钮“;WIN32中的类窗口,c,winapi,button,bitmap,C,Winapi,Button,Bitmap,编辑:我认为在创建子窗口(即我的按钮)期间不会发送WM_创建消息。因此,通过在WM_创建期间调用SendMessage,我将向尚未创建的窗口发送一条消息。目前的解决方案是在WM_SHOWWINDOW消息期间调用SendMessage()。子窗口是否在创建时发送WM_CREATE消息 为什么位图没有显示在按钮上?位图为180x180像素 我有一个资源文件,其中包含: Bit BITMAP bit.bmp 然后,我创建主窗口和子“按钮”窗口,其中包含: HWND b, d; b = Create
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过程中,我向“按钮”窗口发送“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\u CREATE
?由于BUTTON
不是您的窗口类(而是由操作系统定义),它拥有窗口的WndProc
,而不是您-因此代码中的按钮不应调用WM\u CREATE
,因为BUTTON
不是您的类
如果您想接收按钮的消息,则必须对其进行子类化,然后提供自己的
WndProc
当创建该类的窗口时,将使用WM\u CREATE
调用窗口类“a”的窗口过程。这是在您第一次调用CreateWindow
期间,在您创建子按钮
窗口之前WM_CREATE
意思是“你正在被创造”——它并不意味着“一个孩子正在被创造”
解决方案是在类“a”的WM\u CREATE
处理程序中调用d=CreateWindow(L“BUTTON”…)
:
我试图在编辑中解释的是,WM_CREATE只发送到主窗口,而不是按钮。我不是说WM_CREATE没有被发送。我想我的WndProc可能会在创建子窗口的过程中接收WM_CREATE消息。它确实收到了从其子按钮窗口生成的WM_命令消息。谢谢。我也有同样的想法,但当我尝试时,实际上根本没有按钮(甚至连轮廓都没有)。唯一有效的方法是将SendMessage()放在WM_SHOWWINDOW中。我打赌这是因为您调用的是d=CreateWindow(…,b,…),而不是d=CreateWindow(…,hwnd,…)-记住,您在对CreateWindow的第一次调用中,所以b还没有被分配到。
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);