工具提示限制为80个字符,即使将MaxTipWidth设置为32767 我有一个MFC C++项目,它使用了 nMTTSpField结构。当工具提示文本少于80个字符时,一切正常,但有时我需要使用多于80个字符的文本
正如我在MSDN上读到的,我必须使用工具提示限制为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
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);
}