我在报告视图中有一个列表视图,我正在尝试显示每个项目不同的工具提示。
但是我根本无法显示任何工具提示...
这是我到目前为止所想到的:
case LVN_GETINFOTIP:
{
LPNMLVGETINFOTIP GetInfoTip = (LPNMLVGETINFOTIP) lParam;
GetInfoTip->pszText = L"TESTING";
// What do I do now? How do I display the tooltip?
return 0;
}
收到
LVN_GETINFOTIP
消息后,如何显示工具提示?
问题是您正在更换指针
pszText
。您需要修改内存缓冲区的内容。例如使用 StringCchPrintf
.
您是否忘记设置LVS_EX_INFOTIP?
ListView_SetExtendedListViewStyle(hListView, LVS_EX_INFOTIP | LVS_EX_LABELTIP);
看这里举个例子
LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR);
在报告模式下,至少,只有当鼠标移到第0列时才会收到消息
Windows 文档表明 LVN_GETINFOTIP 不是由报表视图列表视图控件发送的。 在实践中我发现情况确实如此(2024)。
那么在这种情况下如何显示工具提示呢?
我明白为什么在使用列表视图控件时有必要找到普通工具提示窗口的替代方案。像列表视图这样的大型控件的问题是,虽然当光标第一次进入控件时会发送 TTN_NEEDTEXT 通知消息(要求指定显示文本),但如果光标随后在控件中移动,则不会发送第二个 TTN_NEEDTEXT 通知消息。将控件移到不同的项目上。这是因为光标仍在同一控件中。
解决此问题的一种方法是将列表视图样式设置为 LVS_EX_TRACKSELECT,然后监视发送到列表视图父级的 LVN_HOTTRACK 消息。 监视此消息时,如果 NMLISTVIEW 中的 iItem 为 -1,则光标位于列表视图中,但不在项目上方,因此不应采取任何操作。 但除此之外,您可以将 TTM_POPUP 发送到工具提示窗口。
这会导致工具提示出现在光标处,在此之前,它将发送 TTN_NEEDTEXT 到使用 TTM_ADDTOOL 将工具提示与列表视图关联时指定的窗口。
为避免每次光标在列表视图控件中移动时发送 TTM_POPUP,仅当 hItem(如果需要测试则为 iSubItem)与上次收到 LVN_HOTTRACK 不同时才发送它。