使用CWnd :: EnableTooltips()可以实现多行工具提示吗?

时间:2010-01-25 17:50:29

标签: c++ mfc tooltip

我试图让我的工具提示多行,但我似乎没有太多运气。我在创建后直接调用CWnd :: EnableTooltips()(在本例中是一个编辑框),我处理TTN_NEEDTEXT消息。我的工具提示显示正确,但只显示为一行。

我尝试在处理TTN_NEEDTEXT时向我传递的字符串添加'\ n',并尝试'\ r \ n'。没运气。它只是在工具提示字符串中将它们显示为普通文本。

然后我尝试手动插入0x0D0A,但这只是显示为方框。

我一直在挖掘,并在网上发现了一些随意的引用,说当通过CWnd函数使用工具提示时,多行行为可能不起作用。我宁愿不用CToolTipCtrl替换(因为它是一个相当大的项目)。有没有人遇到过这个?如果是这样,有什么办法吗?

3 个答案:

答案 0 :(得分:6)

我成功地使用TTN_NEEDTEXT处理程序中的以下代码将\ n分隔的工具提示制作成多行工具提示

对于DevStudio 6

CToolTipCtrl* pToolTip = AfxGetThreadState()->m_pToolTip;
pToolTip->SetMaxTipWidth(SHRT_MAX);

每次调用TTN_NEEDTEXT时都必须再次呼叫,否则它将无法停留。

我发现这个技巧从http://www.codeproject.com/KB/list/CListCtrl_ToolTip.aspx

读取代码

注意:那里的代码实际执行以下操作,但由于ModuleThreadState在VS6中没有m_pToolTip成员,因此无法在VS6中编译(我在VS2005 +中没有尝试过以下内容,但我认为它可以在那里工作)

BOOL CListCtrl_EnableToolTip::OnToolNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
...
   // Break tooltip into multiple lines if it contains newlines (/n/r)
   CToolTipCtrl* pToolTip = AfxGetModuleThreadState()->m_pToolTip;
   if (pToolTip)
      pToolTip->SetMaxTipWidth(SHRT_MAX);
...
}

答案 1 :(得分:0)

我依旧回忆起我已经开始工作了。我google了一下,我想我所做的是设置SetMaxTipWidth()来'强制'工具提示比我输入的文本更窄。我后来切换到我自己的工具提示控制由于其他原因,但我正在使用那里的“设计”相同,我很可能从旧代码中复制了这种行为。如果你已经有一个CToolTipCtrl,我会说一下:)

答案 2 :(得分:0)

这是我在MFC应用程序中打开和关闭的问题。我有所有常见视图/对话框类的子类,可以为我处理工具提示。我发现在某些(比如CListCtrls或CPropertySheets中的头文件)中,每次都不需要你调用SetMaxTipWidth(如上所述),但其他人(CView,CDialog,CPropertyPage,CListCtrl,CTreeCtrl)确实需要你每次调用它弹出工具提示的时间。它有点傻,但似乎有效。