0
我的应用程序之一是从Windows XP移植到WIN7。对于此应用程序工具提示控件在XP中工作时无法在win7中工作。工具提示不是控件
代码逻辑:
我们正处在一个常量字符串设定提示。
aToolTipText =anImageTypeStr;
并传入一个函数,该函数调用ActivateToolTipText(int Id, bool activateFlag)
,它实际上是基于id处理Tooltip。
bool ActivateToolTipText(int Id, bool activateFlag)
{
CSA_TRY
{
// struct specifying info about tool in ToolTip control
TOOLINFO ti;
unsigned int uid = Id; // for ti initialization
LPTSTR lptstr = (LPTSTR)(LPCTSTR)m_strToolTipText[Id];
// CREATE A TOOLTIP WINDOW
if(activateFlag)
{
m_ToolTipHWND[Id] = CreateWindowEx(WS_EX_TOPMOST,
TOOLTIPS_CLASS,
NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
m_hWnd,
NULL,
0,
NULL
);
}
// INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_SUBCLASS ;
ti.hwnd = m_hWnd;
ti.hinst = 0;
ti.uId = uid;
ti.lpszText = lptstr;
// ToolTip control will cover the rect of Id
CRect rect_out;
GetIdArea(Id, &rect_out);
ti.rect = rect_out;
if(activateFlag)
::SendMessage(m_ToolTipHWND[Id], TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO)&ti);
}
else
{
::SendMessage(m_ToolTipHWND[Id], TTM_DELTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
}
return TRUE;
}
}
你在调试器中运行你的代码吗?这可能会揭示问题。只需逐句通过声明并查看是否所有的ID和指针都已正确初始化。问题很可能不在您所显示的代码中,而在您的程序的其他部分中可能与工具提示设施无关。 – nv3
我已经调试了代码和工具提示字符串和ID ID设置正确的工具提示结构。 此外,我注意到使用spy ++后,鼠标移动TTM_RELAYEVENT不是由OLE调用bieng。为什么它不在Windows 7中,而相同的代码正在为XP工作。请提出解决此问题的任何解决方法或根本原因。 – sachin
我得到了解决方案: 更改ti.cbSize = sizeof(TOOLINFO); to ti.cbSize = sizeof(TOOLINFO) - 4; – sachin