- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 win32 api 项目中有一个 TreeView。我想用驱动器上的目录和文件填充 TreeView。我使用一个函数获取所有可用驱动器,然后使用驱动器盘符作为参数调用此函数:
bool ListDirectoryContents(const char *sDir)
{
WIN32_FIND_DATA fdFile;
HANDLE hFind = 0;
vector<string> FileNames;
char sPath[2048];
sprintf(sPath, "%s\\*.*", sDir);
if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
{
printf("Path not found: [%s]\n", sDir);
return false;
}
do
{
if(strcmp(fdFile.cFileName, ".") != 0 && strcmp(fdFile.cFileName, "..") != 0)
{
sprintf(sPath, "%s%s", sDir, fdFile.cFileName);
if((fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if((fdFile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
{
// Directories
AddItemToTree(hwndTree, sPath, 2);
//FileNames.insert(sPath);
//ListDirectoryContents(sPath); // Recursion
}
}
else
{
if((fdFile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
{
//Files
//AddItemToTree(hwndTree, sPath, 2);
FileNames.push_back(sPath);
}
}
}
}
while(FindNextFile(hFind, &fdFile));
FindClose(hFind);
for(vector<string>::iterator FileName = FileNames.begin(); FileName != FileNames.end(); ++FileName)
{
AddItemToTree(hwndTree, (char*)FileName->c_str(), 2);
}
return true;
}
我使用的文件名 vector 首先列出目录,然后列出文件。
AddItemToTree 函数:
HTREEITEM AddItemToTree(HWND hwndTree, char *text, int nLevel)
{
TVINSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
static HTREEITEM hRootItem = NULL;
static HTREEITEM hPrevLev2Item = NULL;
//tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM;
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIS_STATEIMAGEMASK;
tvi.iImage = AddIconToTree(hwndTree, text);
tvi.iSelectedImage = tvi.iImage;
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;
}
问题是,如果我在 ListDirectoryContents
函数中使用递归调用,那么填充 TreeView 中的所有目录和文件需要很长时间。
所以我认为它可以像这样以某种方式工作:
但是问题来了,如何在某个地方插入一些项目?我的意思是 AddItemToTree
函数中的第三个参数是什么?
有没有更简单的方法来用目录填充 TreeView?提前谢谢大家!
最佳答案
通常,您执行此操作的方式根本不是使用 nLevel
参数,而是使用 hItemParent
参数。
也就是说,当您调用 AddItemToTree
时,您会将与父项对应的 HTREEITEM
传递给该函数。当您插入新项目时,这将被馈送到 tvins.hParent
成员。
因此,在您当前拥有 nLevel == 1
的地方,您将拥有 AddItemToTree(hwndTree, "text", TVI_ROOT)
。
要在展开时填充子文件夹,您需要一个 WM_NOTIFY
处理程序来监视 TVN_ITEMEXPANDED
通知。
当您收到此消息时,它会告诉您扩展了哪个项目 - 这是您要传递给 AddItemToTree
的参数。
case WM_NOTIFY:
if (((LPNMHDR)lParam)->code == TVN_ITEMEXPANDED)
{
// work out the path to read, and then ...
AddItemToTree(hwndTree, <path>, ((LPNMTREEVIEW)lParam)->itemNew.hItem);
}
关于c++ - 用驱动器上的目录和文件填充 TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27000450/
我执行以下操作以检查远程计算机上的本地驱动器/分区: Get-WmiObject -Class Win32_Share -ComputerName SERVERNAME -Filter "Descri
我正在尝试扫描包含成千上万个文件的共享网络驱动器,仅查找过去一年中未修改的Word文件。虽然我写的东西行得通,但速度非常慢。我需要扫描多个驱动器,这需要几个小时。我有什么办法可以加快速度? gci \
我记得在 vb6 中有一个类似于 dropbox/combobox 的控件,您可以选择驱动器名称。它会引发一个事件,然后您可以设置另一个控件来枚举列表框中的文件。 (在 drive.event 中你做
USB 驱动器有哪些安全风险? USB 驱动器优点是体积小、容易获得、价格低廉且便于携带,因此在将文件从一台计算机存储和传输到另一台计算机方面很受欢迎。然而,这些优点特征使它们对攻击者具有吸引
驱动器的编程对黑客编程来说至关重要。好在vbs给我们提供了方便的集合,使得工作变得很简单。 1、检查驱动器 使用filesy
我正在尝试编写批处理文件以将文件夹xcopy到可移动USB驱动器。但是,我面临的问题是驱动器号可能会发生变化,因此我希望能够通过引用卷标而不是驱动器号来做到这一点。 有任何想法吗?一个小时的Googl
我正在用 C# 开发一个应用程序,因此,如果用户确认消息框格式化 USB 驱动器,从组合框列表中选择,驱动器将被格式化。 我不知道如何处理这个问题,但是 - 我有以下代码: public stati
我正在尝试将文件保存到 icloud 驱动器。我会选择简单的版本,我不让用户选择保存文件的位置,我只是将它保存在 icloud 驱动器的根目录中。这是我正在使用的代码: func exportToFi
我正在尝试创建一个脚本,我将在其中搜索文件服务器的非继承权限。结果,我遇到了文件名 260 个字符的限制。我看到的一个建议,我认为会有所帮助,有几次是创建一些非持久性的 PS 驱动器,深度为几个级别并
我正在制作一个 USB 驱动器,其中应包含有助于解决用户遇到的各种软件问题的工具。 您建议我添加哪些工具? 主要环境:Windows和.NET 最佳答案 我可以推荐以下内容:{其中一些已经被提及} 日
因此,在稀缺的introduction to inegration testing中,您应该使用 flutter drive --target=test_driver/app.dart 但是我找不到有
我正在尝试让 docker 挂载我的 d 驱动器。一直在与大量的 stack 和 git 作斗争,但它们似乎都不适合我。 我已经将我的d盘添加到共享文件夹 然后我安装在我的 docker-compos
我正在尝试以编程方式从 Powershell 应用程序中安全地删除 USB 驱动器。我当前的代码适用于单卷 USB 驱动器。代码如下: $Eject = New-Object -comObject S
我有一个乏味的项目即将到来。我需要将 USB 闪存驱动器插入计算机,然后将三个文件复制到该驱动器,然后卸载它并重复 3000 次(字面意思)。我希望能想出一些 VBScript 来减少我的 Actio
我正在编写一个提取 xml 的文件以获取文件名,并且需要将这些文件复制到 USB 驱动器。前两个步骤我能够做到这一点。但问题是: 如何检测是否有 U 盘 然后检测它是哪个驱动器。 谢谢! 最佳答案 这
在我的 Java Web 应用程序中,需要单击“保存文件”按钮将 6 个文件从服务器复制到用户计算机 USB 驱动器。 如果未找到 USB 驱动器,则需要显示警告消息“未检测到 USB 驱动器”。 我
您好,我有以下查询来获取 12 个月前的时间窗口内每月发生的驱动器。然而,结果并不正确,例如,在我的测试数据库中,2 月份仅发生了 3 个驱动器,但在我的结果集中,它显示了 9 个驱动器。 SELEC
我一直在尝试找到一种通过 swift 2 和 Xcode 7 连接到我的网络驱动器的方法。我可以连接到我的桌面或文档目录,但不能连接到我的服务器。我玩过 NSString/NSURL 等但无济于事。以
我有几个问题: 以下 C++ 代码是否会导致我的硬盘在经过一定时间后空闲? #include int main() { while(1); } 如果是这样,我可以在此代码中添加什么以确保我的
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我是一名优秀的程序员,十分优秀!