Win32:使用 cchTextMax 在树视图中设置文本长度

Win32: Set text length in Tree View with cchTextMax

是否可以定义在 Win32 应用程序中树视图控件的节点中显示的文本长度?

例如我们有字符串"text|2"。然后我想在节点中存储指向这个字符串的指针,但只显示 "text" 而没有 "|2".

我以为 cchTextMax 字段负责这个,但下一个代码不起作用:

TV_INSERTSTRUCT tvinsert;
tvinsert.item.mask = TVIF_TEXT;
tvinsert.item.pszText = "text|2";
tvinsert.item.cchTextMax= 4;
SendDlgItemMessage(hDlg,IDD_TREE,TVM_INSERTITEM,0,(LPARAM)&tvinsert);

节点字符串显示全文"text|2"。

一种解决方案是将所需文本复制到新指针,然后使用它。但是这个解决方案并不令我满意,因为我也需要用节点存储字符串的最后一部分。

这里来自 TVITEM 的 MSDN 文档:

cchTextMax
Size of the buffer pointed to by the pszText member, in characters. If this structure is being used to set item attributes, this member is ignored.

因此该成员仅在您检索 项目属性时有效,而在您设置 时忽略它(如添加树视图控件的新项目)。将所需文本复制到新指针然后使用的另一种解决方案是一种选择。

C 中的字符串是空终止的字符数组,也就是说,Windows 将显示直到它遇到的第一个 '\0' 之前的任何字符,无法指定长度。 为了做你想做的事,你必须创建一个新的字符串:

const char *s = "text|2";
const char str_to_display[5] = {'[=10=]'};
strncpy(str_to_display, s, 4);

我会扩展 flutter 的答案,并在分隔符的位置插入 '[=10=]'。这个的典型用途是多字符串,其中有一组以 0 结尾的字符串,以双 '[=10=]'.

结尾

作为附带好处,您可以使用 strtok() 来解析您的字符串;它的(有时是不希望的)效果是插入零来代替分隔符。