我的一个应用程序从Windows Xp移植到WIN7。对于这个应用程序,工具提示控件在win7中不起作用,而它适用于XP。
代码逻辑:
我们在const字符串中设置工具提示。
aToolTipText =anImageTypeStr;
并传入一个调用SetToolTipText(LPCTSTR tooltiptext, long Id)
的函数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;
}
}
答案 0 :(得分:0)
问题在于通用控件版本6.对于xp +,头文件CommCtrl.h假设我们将使用comctl版本6,但如果我们不使用清单文件明确启用它,我们仍将使用旧的comctl版本5 。X。问题从这里开始,版本5.x的TOOLINFO的大小与版本6.x不同。因此,如果你需要在windows xp +下使用comctl版本5,你应该使用以下代码TOOLINFO ti初始化TOOLINFO; ti.cbSize = sizeof(TOOLINFO) - 4;