【问题标题】:Displaying a bitmap on a "BUTTON" class window in WIN32在 WIN32 中的“BUTTON”类窗口上显示位图
【发布时间】:2010-10-25 01:15:23
【问题描述】:

编辑:我认为在创建子窗口(即我的按钮)期间不会发送 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() 函数在客户区显示位图。所以我要么没有正确发送消息,要么没有正确创建“按钮”窗口。

我做错了什么?

谢谢!

【问题讨论】:

    标签: c winapi button bitmap


    【解决方案1】:

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

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

    【讨论】:

    • 我在编辑中试图解释的是 WM_CREATE 只发送到主窗口,而不是按钮。我并不是说没有发送 WM_CREATE。我想也许我的 WndProc 会在创建其子窗口期间收到 WM_CREATE 消息。它毕竟会接收从其子按钮窗口生成的 WM_COMMAND 消息。
    【解决方案2】:

    当创建该类的窗口时,使用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);
    

    【讨论】:

    • 谢谢。我也有同样的想法,但是当我尝试它时,我实际上根本没有得到任何按钮(甚至没有轮廓)。唯一有效的方法是将 SendMessage() 放入 WM_SHOWWINDOW。
    • 我打赌那是因为你调用的是 d = CreateWindow(..., b, ...) 而不是 d = CreateWindow(..., hwnd, ...) - 记住,你'在对 CreateWindow 的第一次调用中,因此尚未将 b 分配给。
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2011-09-28
    • 2020-02-16
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多