我正在尝试让我的工具栏与ImageList
一起使用。图像是单独的PNG,所以我在ImageList
中连续添加它们,Bbt它不起作用。以下是将Image
添加到ImageList
的代码:
HIMAGELIST CreateToolBarImages(HINSTANCE hInst)
{
HIMAGELIST v_ImageList = NULL;
// IMAGE_LIST v_Img;
HICON hIcon;
HBITMAP hBit;
COLORMAP cMap;
COLORREF fromColor = RGB( 0,0,0 );
InitCommonControls();
v_ImageList = ImageList_Create(32, 32, ILC_MASK, 1, 1);
cMap.from = fromColor;
cMap.to = ::GetSysColor(COLOR_BTNFACE);
hBit = CreateMappedBitmap(hInst, IDB_CONSOLE, 0, &cMap, 1);
// hBit = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CONSOLE));
consoleImg = ImageList_Add(v_ImageList, hBit, 0);
if (consoleImg == -1)
return NULL;
DeleteObject(hBit);
// [edit Franci Penov]
return v_ImageList;
}
然后我创建了ToolBar,但它在Image函数中失败了。
HWND CreateToolBarButton(HWND hWndParent)
{
const int ImageID = 0;
const int numB = 1;
COLORREF iColor;
HWND hToolBar = CreateWindowEx(0,
TOOLBARCLASSNAME,
NULL,
WS_CHILD |TBSTYLE_LIST |TBSTYLE_FLAT | WS_VISIBLE,
0,0,0,0,
hWndParent,
NULL,
g_hInst,
NULL);
if (hToolBar == NULL)
return NULL;
HIMAGELIST ImgList = CreateToolBarImages(g_hInst);
if (ImgList == NULL)
MessageBox( hWndParent, L"No Tool Images", L"BOB", MB_OK );
// [edit Franci Penov]
return hToolBar;
}
我有什么遗失或不做的事吗?
答案 0 :(得分:3)
什么“不工作”。 CreateMappedBitmap用于加载具有颜色表的图像 - 这意味着它们具有< = 256种颜色。
PNG暗示您正在使用带有Alpha通道的32bpp图像,这意味着您无法使用* MappedBitmap功能。
答案 1 :(得分:1)
我在示例代码中返回值时做了一些更改,上面标有注释。
有关如何使用Win32 Toolbar
控件的详细说明,请阅读this MSDN article。
特别是,您的代码似乎缺少的是将TB_SETIMAGELIST
消息发送到Toolbar
控件以加载您刚刚创建的ImageList
:
// Set the image list.
SendMessage(hToolBar, TB_SETIMAGELIST, 0, (LPARAM)ImgList);
当然,在那里可能还有其他缺少的东西,但这将是一个很好的起点。
你还有一些GDI对象内存泄漏,你会在几个地方进行错误检查并提前退出你的功能。你可能也希望清理它们。
答案 2 :(得分:0)
嗨,谢谢你,我已经解决了我的问题, 克里斯你是对的,在我发布后我做了那个观察,我需要使用GDI +来使用PNG,我选择使用图标而不是它现在完美地工作。弗朗西,谢谢你我也清理了代码。
的问候,
答案 3 :(得分:-1)
你可以尝试使用这些代码: https://github.com/Itseez/opencv/blob/master/samples/cpp/imagelist_creator.cpp
对我来说它运作得很好
在您需要安装openCV库之前;)