工具提示限制为80个字符,即使将MaxTipWidth设置为32767 我有一个MFC C++项目,它使用了 nMTTSpField结构。当工具提示文本少于80个字符时,一切正常,但有时我需要使用多于80个字符的文本

工具提示限制为80个字符,即使将MaxTipWidth设置为32767 我有一个MFC C++项目,它使用了 nMTTSpField结构。当工具提示文本少于80个字符时,一切正常,但有时我需要使用多于80个字符的文本,c++,winapi,mfc,tooltip,C++,Winapi,Mfc,Tooltip,正如我在MSDN上读到的,我必须使用lpszText而不是sztext 我的代码是: TTooltipText& tiTxt = *(TTooltipText*)nmhdr; ::SendMessage(NMHDR(tiTxt).hwndFrom, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX); CString pricesStr = GetPrices(); tiTxt.lpszText = pricesStr.GetBuffer(pricesStr.GetLen

正如我在MSDN上读到的,我必须使用
lpszText
而不是
sztext

我的代码是:

TTooltipText& tiTxt = *(TTooltipText*)nmhdr;
::SendMessage(NMHDR(tiTxt).hwndFrom, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);
CString pricesStr = GetPrices();
tiTxt.lpszText = pricesStr.GetBuffer(pricesStr.GetLength());

但不幸的是,此代码不起作用,请提供帮助?

我无法用win32应用程序重现您的问题

使用
发送消息(hwndTT,TTM_SETMAXTIPWIDTH,0,150)我得到如下多行工具提示:

没有
发送消息(hwndTT,TTM_SETMAXTIPWIDTH,0,150)我得到的单行工具提示如下:

我使用的代码(c++)如下基于:


首先创建工具提示,如下所示:

HWND CreateToolTip(HWND hwndParent)
{
   // Create a tooltip.
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL,
    WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    hwndParent, NULL, hInst, NULL);

    SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0,
     SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

    //Set up "tool" information. In this case, the "tool" is the entire parent window

  TOOLINFO ti = { 0 };
  ti.cbSize = sizeof(TOOLINFO);
  ti.uFlags = TTF_SUBCLASS;
  ti.hwnd = hwndParent;
  ti.hinst = hInst;
  ti.lpszText = LPSTR_TEXTCALLBACK; // this to use tooltip notify message

  GetClientRect(hwndParent, &ti.rect);

  SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, 500);

   // Associate the tooltip with the "tool" window.
  SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&ti);
}
注意:使用LPSTR_TEXTCALLBACK意味着您必须定义TTN_NEEDTEXT消息处理程序

ON_NOTIFY(TTN_NEEDTEXT, 0, HandleTooltipText)
最后,我们将TTN_NEEDTEXT消息处理程序定义为:

void HandleTooltipText(NMHDR* nmhdr, LRESULT*)
{
    NMTTDISPINFO* toolTip = (NMTTDISPINFO*)nmhdr;
    CString prices = GetPrices();
    if (toolTip->hdr.code == TTN_GETDISPINFO)
    {
       toolTip->lpszText = new TCHAR[prices.GetLength() + 1];
       memset(toolTip->lpszText, 0, (prices.GetLength() + 1) * sizeof(TCHAR));
       _tcscpy_s(toolTip->lpszText, prices.GetLength() + 1, prices.GetString());
       toolTip->hinst = 0;
    }
}

设置MFC共享工具提示ctrl的最大宽度

static CToolTipCtrl* pToolTip = NULL;
CToolTipCtrl* pTT = AfxGetModuleThreadState()->m_pToolTip;

// MFC shared tooltip sometimes loses its maxtipwidth eventhough
// its object has not changed
if (/*pTT != pToolTip 
        && */pTT != NULL) {
    pToolTip = pTT;
    pToolTip->SetMaxTipWidth(SHRT_MAX);
    pToolTip->SetDelayTime(TTDT_AUTOPOP, SHRT_MAX);
}

如果lpszText是工具提示文本字符串的地址,请确保将
hinst
设置为NULL。您的字符串中有任何符号和字符或制表符吗?@RitaHan MSFT是的,我使用了\t和\n字符,但我也尝试了一个没有任何特殊字符的长字符串,也不起作用。您是否检查了
SendMessage
的返回值以查看它是否成功?@RitaHan MSFT I'现在检查,它返回错误-1,为什么?我的代码中有错误吗?:“当CSimpleStringT对象被销毁时,缓冲区内存会自动释放。”您正在传递一个指向字符串(GetPrices)的指针,该字符串在函数超出范围后无效。尝试将此字符串保存为类成员。谢谢@Rita,我编写了相同的代码,但现在我的应用程序在_tWinMain发生崩溃,并且没有调用堆栈,在ntdll.dll“External code”出现错误。有什么建议可以解决它吗?另一个信息我正在使用ti.lpszText=LPSTR_TEXTCALLBACK来处理TTN_NEEDTEXT消息,就像在_NOTIFY上一样(TTN_NEEDTEXT,0,HandletToolTiptext). afx_msg void handletooltipext(NMHDR*NMHDR,LRESULT*)@BassamNajeeb您是否尝试过使用win32 windows应用程序()而不是MFC?如果是,请出示一份小型、完整且可复制的样品。
static CToolTipCtrl* pToolTip = NULL;
CToolTipCtrl* pTT = AfxGetModuleThreadState()->m_pToolTip;

// MFC shared tooltip sometimes loses its maxtipwidth eventhough
// its object has not changed
if (/*pTT != pToolTip 
        && */pTT != NULL) {
    pToolTip = pTT;
    pToolTip->SetMaxTipWidth(SHRT_MAX);
    pToolTip->SetDelayTime(TTDT_AUTOPOP, SHRT_MAX);
}