如何找到标签等于字符串变量的树视图节点?

2024-01-02

首先,我想感谢所有花时间查看此帖子并尝试提供帮助的人。

我在互联网上搜索过,但找不到选择标签文本与字符串变量的文本相同的树视图节点的示例。

在 MSDN 上我找到了消息 TVM_GETISEARCHSTRING 但我不知道它是否可以用来解决我的问题。即使可以,我还是不知道怎么用。

我有一个字符串变量,用于保存数据库中的文本。 当程序加载时,树视图应该有一个选择了相同文本的节点。

请帮助提供一些说明或代码片段,因为我不知道如何开始编码。

我在 MS Visual Studio Express 2008、Windows XP、C++ 中工作,使用纯 WIN32 API。

就这些了,再次感谢所有试图提供帮助的人。非常非常感谢!

EDIT:

这两个答案都对我有好处,但我不知道如何标记它们,似乎在这个网站上只能接受一个答案。

我不能忽视他们为帮助我而投入的所有工作,所以我写这篇文章是为了尝试至少通过正式声明他的解决方案对我来说也可以接受来回报乔纳森,只是蒂姆的解决方案更适合我的编码风格。我也会对这两个答案都投赞成票。


树视图控件不提供用于搜索标签的 API。您必须手动遍历这些项目并将它们与您的字符串进行比较。

如果您的树视图深度超过一层,您将必须决定如何遍历项目(深度优先或广度优先)。如果有多个具有相同标签的项目,这些策略可能会返回不同的项目。

一个实现可能看起来像这样:

// Helper function to return the label of a treeview item
std::wstring GetItemText( HWND hwndTV, HTREEITEM htItem )
{
    static const size_t maxLen = 128;
    WCHAR buffer[ maxLen + 1 ];

    TVITEMW tvi = { 0 };
    tvi.hItem = htItem;         // Treeview item to query
    tvi.mask = TVIF_TEXT;       // Request text only
    tvi.cchTextMax = maxLen;
    tvi.pszText = &buffer[ 0 ];
    if ( TreeView_GetItem( hwndTV, &tvi ) )
    {
        return std::wstring( tvi.pszText );
    }
    else
    {
        return std::wstring();
    }
}

这是实际遍历发生的地方。递归调用该函数,直到无法搜索到更多项目或找到匹配项为止。此实现使用区分大小写的比较(wstring::operator==( const wstring& ))。如果您需要不同的谓词,您将必须根据您的需要修改实现。

HTREEITEM FindItemDepthFirstImpl( HWND hwndTV, HTREEITEM htStart, const std::wstring& itemText )
{
    HTREEITEM htItemMatch = NULL;

    HTREEITEM htItemCurrent = htStart;
    // Iterate over items until there are no more items or we found a match
    while ( htItemCurrent != NULL && htItemMatch == NULL )
    {
        if ( GetItemText( hwndTV, htItemCurrent ) == itemText )
        {
            htItemMatch = htItemCurrent;
        }
        else
        {
            // Traverse into child items
            htItemMatch = FindItemDepthFirstImpl( hwndTV, TreeView_GetChild( hwndTV, htItemCurrent ), itemText );
        }
        htItemCurrent = TreeView_GetNextSibling( hwndTV, htItemCurrent );
    }

    return htItemMatch;
}

以下函数包装递归并将根元素作为起点传递。这是您将在代码中调用的函数。它将返回一个HTREEITEM如果找到的话NULL否则。

HTREEITEM FindItem( HWND hwndTV, const std::wstring& itemText )
{
    HTREEITEM htiRoot = TreeView_GetRoot( hwndTV );
    return FindItemDepthFirstImpl( hwndTV, htiRoot, itemText );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到标签等于字符串变量的树视图节点? 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐