C++ TreeView添加Shell图标
我已经创建了treeview,可以在其中添加一些项目。基本上,我想树状视图与图标相关的所有目录和文件。 所以我有这些功能:C++ TreeView添加Shell图标,c++,listview,winapi,treeview,icons,C++,Listview,Winapi,Treeview,Icons,我已经创建了treeview,可以在其中添加一些项目。基本上,我想树状视图与图标相关的所有目录和文件。 所以我有这些功能: 向treeview添加项目 HTREEITEM AddItemToTree(HWND hwndTree, char *text, int nLevel) { TVINSERTSTRUCT tvins; static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; static HTREEITEM hRootItem =
HTREEITEM AddItemToTree(HWND hwndTree, char *text, int nLevel)
{
TVINSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
static HTREEITEM hRootItem = NULL;
static HTREEITEM hPrevLev2Item = NULL;
AddIconToTree(hwndTree, text); //////////// THIS IS THE FUNCTION BELOW...
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIS_STATEIMAGEMASK;
tvi.iImage = 0;
tvi.iSelectedImage = 0;
tvi.pszText = GetFileNameFromPath(text);
tvins.hInsertAfter = hPrev;
tvins.item = tvi;
if(nLevel == 1)
{
tvins.hParent = TVI_ROOT;
}
else if(nLevel == 2)
{
tvins.hParent = hRootItem;
}
else
{
TVITEM tviSetup;
tviSetup.hItem = hPrev;
tviSetup.mask = TVIF_PARAM;
TVITEM * tviLocal = &tviSetup;
TreeView_GetItem(hwndTree, tviLocal);
if(nLevel > tviLocal->lParam)
{
tvins.hParent = hPrev;
}
else
{
HTREEITEM hPrevLocal = TreeView_GetParent(hwndTree, hPrev);
tviLocal->hItem = hPrevLocal;
TreeView_GetItem(hwndTree, tviLocal);
for(int i = nLevel; i <= tviLocal->lParam;)
{
HTREEITEM hPrevLocalTemp = TreeView_GetParent(hwndTree, hPrevLocal);
hPrevLocal = hPrevLocalTemp;
tviLocal->hItem = hPrevLocal;
TreeView_GetItem(hwndTree, tviLocal);
}
tviLocal->mask = TVIF_TEXT;
TreeView_GetItem(hwndTree, tviLocal);
tvins.hParent = hPrevLocal;
}
}
hPrev = (HTREEITEM)SendMessage(hwndTree, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvins);
if(hPrev == 0)
{
return false;
}
if(nLevel == 1)
{
hRootItem = hPrev;
}
return hPrev;
}
FILE\u ATTRIBUTE\u DIRECTORY
。。。
就这样。
任何帮助都将非常感激!
提前感谢:-)在您的
Addicontore
功能中,您每次都会创建一个全新的图像列表,其中只有一个图标。您需要维护相同的图像列表并向其添加其他图标,而不是为每个项目重新创建它
或者,您可以使用函数获取shell imagelist的句柄,然后直接将其分配给树。如果您不需要将自己的任何图像添加到树的图像列表中,这是一种更容易显示文件和文件夹系统图标的方法,因为shell imagelist可以为您处理所有这些
// To initialise the tree's image list - do this one time only
HIMAGELIST himg;
if (SUCCEEDED(SHGetImageList(SHIL_SMALL, IID_IImageList, reinterpret_cast<void**>(&himg))))
SendMessage(hwndTree, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)himg);
当您实际向列表中添加项目时,请确保将索引分配给该项目:
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIS_STATEIMAGEMASK;
tvi.iImage = tvi.iSelectedImage = AddIconToTree(hwndTree, text);
在
addicontore
函数中,您每次都在创建一个全新的图像列表,其中只有一个图标。您需要维护相同的图像列表并向其添加其他图标,而不是为每个项目重新创建它
或者,您可以使用函数获取shell imagelist的句柄,然后直接将其分配给树。如果您不需要将自己的任何图像添加到树的图像列表中,这是一种更容易显示文件和文件夹系统图标的方法,因为shell imagelist可以为您处理所有这些
// To initialise the tree's image list - do this one time only
HIMAGELIST himg;
if (SUCCEEDED(SHGetImageList(SHIL_SMALL, IID_IImageList, reinterpret_cast<void**>(&himg))))
SendMessage(hwndTree, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)himg);
当您实际向列表中添加项目时,请确保将索引分配给该项目:
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIS_STATEIMAGEMASK;
tvi.iImage = tvi.iSelectedImage = AddIconToTree(hwndTree, text);
感谢您的快速回复!嗯,我已经用
SHGetImageList
尝试了一些东西,但不是很成功。用它我根本看不到任何图标。老兄,你应该得到一枚巨大的金牌!它起作用了!非常感谢你!真的很感激:)不幸的是我没有足够的声望去投票,但至少我可以把你的答案标记为解决方案:)再次感谢你!感谢您的快速回复!嗯,我已经用SHGetImageList
尝试了一些东西,但不是很成功。用它我根本看不到任何图标。老兄,你应该得到一枚巨大的金牌!它起作用了!非常感谢你!真的很感激:)不幸的是我没有足够的声望去投票,但至少我可以把你的答案标记为解决方案:)再次感谢你!