Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在“屏幕”上显示位图;按钮“;WIN32中的类窗口_C_Winapi_Button_Bitmap - Fatal编程技术网

C 在“屏幕”上显示位图;按钮“;WIN32中的类窗口

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

编辑:我认为在创建子窗口(即我的按钮)期间不会发送WM_创建消息。因此,通过在WM_创建期间调用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过程中,我向“按钮”窗口发送“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);