一说到ToolTip显示不出来,网上一查,说的多半是PreTranslateMessage未被调用。
我遇到的情况比较特殊,我用的CButtonST这个类,使用Create动态创建按钮的方法。创建后,调用SetTooltipText函数。当鼠标移动到按钮的上方,PreTranslateMessage被调用了,但依然显示不出tooltip。
分析后发现,动态创建的语句如下:
pButton->Create(_T(""), WS_CHILD|WS_VISIBLE|BS_CHECKBOX,
CRect(0, 0, 0, 0), this, nControlID);
这里,创建好的Button的大小为0,由于
BtnST.cpp中
SetTooltipText函数内有如下代码
if (m_ToolTip.GetToolCount() == 0)
{
CRect rectBtn;
GetClientRect(rectBtn);
m_ToolTip.AddTool(this, lpszText, rectBtn, 1);
}
可以看出rectBtn为(0,0,0,0),而AddTool的lpRectTool解释如下
lpRectToolPointer to a RECT structure containing coordinates of the tool's bounding rectangle. The coordinates are relative to the upper-left corner of the client area of the window identified bypWnd.
所以,原因为虽然设置了ToolTip,但ToolTip的产生前提是在鼠标挪到范围在(0,0,0,0)的位置内才显示tootip,所以不显示。
一种改法:
步骤一:修改CButtonST::SetTooltipText函数,改后如下:
CRect rectBtn;
GetClientRect(rectBtn);
if (m_ToolTip.GetToolCount() == 0)
{
m_ToolTip.AddTool(this, lpszText, rectBtn, 1);
} // if
m_ToolTip.SetToolRect(this, 1, rectBtn);
步骤二:
增加OnSize处理函数
void CButtonST::OnSize(UINT nType, int cx, int cy)
{
CButton::OnSize(nType, cx, cy);
if (
(m_ToolTip.GetSafeHwnd() != NULL)
&& (m_ToolTip.GetToolCount() >= 1)
)
{
m_ToolTip.SetToolRect(this, 1, CRect(0, 0, cx, cy));
}
}