【发布时间】:2017-04-04 14:58:00
【问题描述】:
这让我很头疼:我不能使用给定的位图显示在按钮上 - Windows 说这是一个“无效参数”。
这是我的代码:
// creating the button
const HWND hButton=::CreateWindow("button","text",WS_CHILD|VS_VISIBLE,0,0,100,100,hParent,0,editor.m_hInstance,NULL);
// loading the bitmap to be shown on a button
const HBITMAP hBmp=(HBITMAP)::LoadImage(editor.m_hInstance,MAKEINTRESOURCE(ID_MYBITMAP),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT);
// associating the bitmap with a button that lacks the BS_BITMAP style (I want both image and text to be shown)
::SendMessage( hButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp );
// getting the error
const int err=::GetLastError(); // returns 0x56, "Invalid parameter"
请注意,我可以在表单的画布上显示加载的图像,因此图像确实正确加载。
我尝试了位图的各种分辨率(每像素 4 位,每像素 8 位,标准调色板,真彩色,每像素 32 位) - 没有任何效果。我阅读了关于这个主题的大量先前问题,所有这些问题都声称::LoadImage / BM_SETIMAGE 组合是最终解决方案 - 到目前为止没有结果。
所以我的两个问题:
1) 图像要显示在按钮上是否需要满足任何要求?
2) 如果不是,那我到底做错了什么?
非常感谢您的回复。
托马斯
【问题讨论】:
-
好吧,对于初学者来说,
GetLastError在这里不相关:大多数实际上通过SetLastError传递错误代码的 Windows API 函数都被记录为这样做 - 通常可以从 'kernel32.lib' 获得函数。 -
是的,我很想了解更多关于执行
BM_SETIMAGE时失败的信息,但GetLastError是我在这种情况下能想到的最佳选择。 -
SendMessage调用有一个返回值。当发送BM_SETIMAGE 消息时,它会将句柄返回到先前设置的图像。您将不得不查看返回值。此外,您需要设置某些button styles 才能显示图像,但您的问题没有显示创建按钮的代码(或资源脚本)。不要让我们猜测,而是提供minimal reproducible example。 -
GetLastError()仅在SendMessage调用本身失败时才有意义。 -
按钮只有
WM_CHILD和WM_VISIBLE样式。它没有设置BS_BITMAP(用于显示文本和图像)。
标签: c++ image winapi button bitmap