【问题标题】:Dynamic Tooltips: TTN_GETDISPINFO not send when using LPSTR_TEXTCALLBACK动态工具提示:使用 LPSTR_TEXTCALLBACK 时不发送 TTN_GETDISPINFO
【发布时间】:2015-11-03 20:44:50
【问题描述】:

我正在尝试向我的 mfc 应用程序添加动态工具提示。我可以使用带有静态文本的CToolTipCtrl 来显示工具提示。但是,当我将文本更改为 LPSTR_TEXTCALLBACK 时,我没有收到 TTN_GETDISPINFO 通知来设置文本并且不再显示任何内容。

我从头开始创建了一个新的 MFC 项目,它在那里工作。所以在我的应用程序中必须有所不同。但我无法找出我做错了什么或我应该从哪里开始寻找。

这种行为的可能原因是什么?通知是否有可能转移到其他地方?

我添加了这样的处理程序:

ON_NOTIFY(TTN_GETDISPINFO, NULL, OnToolTipNotify)

void CChildView::OnToolTipNotify(NMHDR* pNMHDR, LRESULT* pResult)
{
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
    wsprintf(pTTTW->szText,L"Hello World!");
}

工具提示是使用 Jeff Prosise MFC 书中的 CMyToolTipCtrl 类添加到 OnCreate 函数中的:

CToolTipCtrl* tooltip = new CToolTipCtrl;
tooltip->Create(this, TTS_ALWAYSTIP);
TOOLINFO ti;
ti.cbSize = sizeof (TOOLINFO);
ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
ti.hwnd = this->GetSafeHwnd ();
ti.uId = (UINT) tooltip->GetSafeHwnd ();
ti.hinst = AfxGetInstanceHandle ();
ti.lpszText = (LPTSTR) LPSTR_TEXTCALLBACK;

SendMessage (TTM_ADDTOOL, 0, (LPARAM) &ti);

如果我将倒数第二行改为

ti.lpszText = (LPTSTR) L"Hello World!";

工具提示也会显示在我的应用程序中。

【问题讨论】:

  • TTN_GETDISPINFO: "此通知代码以WM_NOTIFY 消息的形式发送。" 您是否在所有者窗口中安装了WM_NOTIFY 消息处理程序?请出示您的代码。
  • 正如我所说,它适用于新创建的项目。但我会添加代码。
  • this 可以是任何东西。 CChildViewCMyToolTipCtrl的所有者窗口吗?
  • 此代码在CChildView::OnCreate 中执行。所以this 指的是CChildView 实例。这是我创建的工作示例应用程序的整个 CChildView 类的代码:pastebin.com/FLYaRAwu
  • 您是否尝试将CMyToolTipCtrl 替换为库存CToolTipCtrl,以验证自定义控件实现不会导致此问题。

标签: c++ visual-studio-2013 mfc tooltip


【解决方案1】:

这可能是你的项目设置的问题。

这是一个什么样的项目? Unicode 或 MBCS。

如果是 MBCS 消息,您可能会错过通知,因为工具提示是 unicode 窗口并发送 TTN_GETDISPINFOW! 所以对我来说最佳实践是始终同时实现通知 TTN_GETDISPINFOW 和 TTN_GETDISPINFOA。

您可以使用 Spy++ 进行检查

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多