gpt4 book ai didi

c++ - 将一张位图的一部分复制到 ImageList 中

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:13 25 4
gpt4 key购买 nike

背景简介:我有一个 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);

其中 cxcyn 均已指定(在本例中分别为 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 中得到的只是黑色方 block (恰好是 Treeview 的背景颜色),所以我假设最后一段代码出了问题——加载皮肤并尝试的代码将它的一部分通过 BitBlt 转换成新的位图以保存到 ImageList。任何人都可以告诉我我做错了什么,或者告诉我完成我想做的事情的更好方法吗?

我只使用 C++ 和 Windows API,没有 .NET、MFC 或 Windows 窗体设计器。

在此先感谢您的帮助,如果我遗漏了任何内容,我深表歉意;这是我的第一篇文章。

最佳答案

您的代码存在一些问题。

首先,当您创建一个新的 DC 时,它以一个单色位图开始,因此您的 CreateCompatibleBitmap 调用也会生成一个单色位图。相反,您可能希望基于窗口或屏幕 DC 创建位图。

其次,您实际上从未将位图选择到 dcDest 中,因此无论如何都不会将任何内容绘制到 hIcon 中。

第三,如果位图当前被选择到设备上下文中,ImageList_Add 将失败,因此您必须先从 dcDest 中取消选择 hIcon将图标添加到图像列表。

最后,你也忽略了保存原始位图并恢复它们,所以这也会导致 GDI 泄漏。

尝试这样的事情:

HDC hdcWindow = GetDC(hWnd);
HDC dcDest = CreateCompatibleDC(hDCWindow);
HBITMAP hIcon = CreateCompatibleBitmap(hDCWindow, cx, cy);
HDC dcSrc = CreateCompatibleDC(NULL);

HGDIOBJ hOldSourceBmp = SelectObject(dcSrc, hSkin);
HGDIOBJ hOldDestBmp = SelectObject(dcDest, hIcon);

BitBlt(dcDest, 0, 0, cx, cy, dcSrc, x, y, SRCCOPY);

SelectObject(dcDest, hOldDestBmp);
SelectObject(dcSrc, hOldSourceBmp);

*pIcon = ImageList_Add(m_hImageList, hIcon, NULL);

DeleteObject(hIcon);
DeleteDC(dcSrc);
DeleteDC(dcDest);
ReleaseDC(hWnd, hDCWindow);

关于c++ - 将一张位图的一部分复制到 ImageList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com