快速背景:我有一个 TreeView,它是使用 C++ 中的 Windows API 调用创建的(Visual Studio 2008,尽管这应该没什么区别):
hTreeview = CreateWindowEx(0, WC_TREEVIEW, L"My Treeview", WS_CHILD | WS_VISIBLE | TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_SINGLEEXPAND, m_tx, m_ty, m_tw, m_th, hWindow, (HMENU)2, hInstance, NULL);
我已使用以下方法成功为其分配了一个 ImageList:
m_hImageList = ImageList_Create(cx, cy, ILC_COLOR24, n, n);
TreeView_SetImageList(hTreeview, m_hImageList, TVSIL_NORMAL);
其中cx
、cy
和n
都已指定(在本例中,分别为 18、18 和 5)。正如我所看到的,这一切都很好,因为现在我的物品旁边留出了空间来放置图像。
我想要完成的是然后复制另一个位图的一部分(从文件中)。我尝试过(但不起作用)的代码是这样的:
HBITMAP hSkin = (HBITMAP)LoadImage(NULL, szPathBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
for (long i = 0; i < n; i++)
{
HDC dcDest = CreateCompatibleDC(NULL);
HBITMAP hIcon = CreateCompatibleBitmap(dcDest, cx, cy);
HDC dcSrc = CreateCompatibleDC(NULL);
SelectObject(dcSrc, hSkin);
BitBlt(dcDest, 0, 0, cx, cy, dcSrc, x, y, SRCCOPY);
*pIcon = ImageList_Add(m_hImageList, hIcon, NULL);
DeleteObject(hIcon);
DeleteDC(dcSrc);
DeleteDC(dcDest);
}
DeleteObject(hSkin);
为简洁起见,我省略了错误检查代码,可以假设所有列出的变量都已设置在程序的其他位置(请原谅我没有提供工作源文件,但这是一个非常大的项目,我试图只包括相关的部分)。
我在 Treeview 中得到的只是黑色方块(恰好是 Treeview 的背景颜色),所以我假设最后一段代码出了问题——加载皮肤并尝试 BitBlt a它的一部分到一个新的位图中保存到 ImageList。谁能告诉我我做错了什么,或者告诉我一个更好的方法来完成我想做的事情?
我只使用 C++ 和 Windows API,没有 .NET、MFC 或 Windows 窗体设计器。
提前感谢您的帮助,如果我遗漏了任何内容,我深表歉意;这是我的第一篇文章。