我创建了一个从CWnd派生的自定义控件(折线图),我想知道是否可以使用CToolTipCtrl来显示图上点的工具提示。如果可以,如何实现呢?
另外,当我将鼠标移动到该点上时,应弹出包含有关该点值信息的字符串的矩形框。
另外,当我将鼠标移动到该点上时,应弹出包含有关该点值信息的字符串的矩形框。
是的,这个方法是有效的,实际上我也在使用这种方法,在折线图表中同样适用,但是还有一些缺点/注意事项。消息处理有点不稳定,有些消息不按照文档发送,需要一些解决方法来保持控件的自包含性(不需要父级帮助反映通知)。
你需要在你的CWnd派生类中声明一个变量。
CToolTipCtrl m_ToolTipCtrl;
CString m_ToolTipContent;
在OnCreate中执行以下操作:
m_ToolTipCtrl.Create(this, TTS_ALWAYSTIP);
m_ToolTipCtrl.Activate(TRUE);
你还可以选择设置延迟时间:
m_ToolTipCtrl.SetDelayTime(TTDT_AUTOPOP, -1);
m_ToolTipCtrl.SetDelayTime(TTDT_INITIAL, 0);
m_ToolTipCtrl.SetDelayTime(TTDT_RESHOW, 0);
m_ToolTipCtrl.Pop();
但是这仅适用于UNICODE版本。所以如果您仍在使用MBCS(就像我一样),您只能在一定的延迟后显示工具提示。 在OnMouseMove中使用以下代码设置您的工具提示文本:
// Not using CToolTipCtrl::AddTool() because
// it redirects the messages to the parent
TOOLINFO ti = {0};
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND; // Indicate that uId is handle to a control
ti.uId = (UINT_PTR)m_hWnd; // Handle to the control
ti.hwnd = m_hWnd; // Handle to window
// to receive the tooltip-messages
ti.hinst = ::AfxGetInstanceHandle();
ti.lpszText = LPSTR_TEXTCALLBACK;
ti.rect = <rectangle where, when the mouse is over it, the tooltip should be shown>;
m_ToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
m_ToolTipCtrl.Activate(TRUE);
m_ToolTipContent = "my tooltip content";
// The build-agnostic one doesn't work for some reason.
ON_NOTIFY_EX(TTN_NEEDTEXTA, 0, OnTTNNeedText)
ON_NOTIFY_EX(TTN_NEEDTEXTW, 0, OnTTNNeedText)
BOOL GraphCtrlOnTTNNeedText(UINT id, NMHDR* pTTTStruct, LRESULT* pResult)
{
TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pTTTStruct;
//pTTT->lpszText = "some test text";
//pTTT->lpszText = m_ToolTipContent;
strncpy_s(pTTT->lpszText, 80, m_ToolTipContent, _TRUNCATE);
return TRUE;
}
CToolTipCtrl ToolTip;
#define TOOLTIP_ID 1
ToolTip.Create(this, TTS_ALWAYSTIP );
CRect rc;
GetClientRect(rc);
ToolTip.AddTool(this, "Tool tip text", rc, TOOLTIP_ID);
ToolTip.RelayEvent(msg);
ToolTip.UpdateTipText("New Tip Text", this, TOOLTIP_ID);
m_ToolTipCtrl.Create(this, TTS_ALWAYSTIP);
上遇到了异常,除了这段代码之外还有其他应该做的吗?很难找到关于自定义控件中嵌入工具提示的资料。 - dragan.stepanovicttCtrl->Create(this, TTS_ALWAYSTIP);
处中断, 并显示以下消息:Unhandled exception at 0x00418c29 in TestApp.exe: 0xC0000005: Access violation reading location 0x00000000.
,因为它获取了空指针来读取。 如果我交换CWnd::Create和MyCustomCtrl::Create之间的调用顺序,我会得到相同的错误。 - dragan.stepanovic