CScrollView 中的跟踪工具提示?
Tracking tooltip in CScrollView?
在标准的C++/MFC MDI doc/view项目中,我想在视图(选项卡式视图窗口,通常占据大部分主框架窗口(中实现跟踪工具提示。所以,在MyAppView
班,我有一个成员CToolTipCtrl tooltip
。函数MyAppView::OnInitialUpdate()
包含初始化
BOOL ok0 = tooltip.Create(this, TTS_ALWAYSTIP);
CRect clientRect; GetClientRect(&clientRect);
BOOL ok2 = tooltip.AddTool(this, LPSTR_TEXTCALLBACK, &clientRect, 1234/*tool ID*/);
tooltip.Activate(TRUE);
使视图的整个工作区成为"工具"。消息映射包含一个条目
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnNeedToolTipText)
函数OnNeedToolTipText
定义为
BOOL MyAppView::OnNeedToolTipText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
UNREFERENCED_PARAMETER(id);
NMTTDISPINFO *pTTT = (NMTTDISPINFO *)pNMHDR;
UINT_PTR nID = pNMHDR->idFrom;
BOOL bRet = FALSE;
if(nID == 1234)
{
// Come here when text is needed for tracking tooltip
}
if(pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
if(nID)
{
_stprintf_s(pTTT->szText, sizeof(pTTT->szText) / sizeof(TCHAR),
_T("Control ID = %d"), nID);
pTTT->hinst = AfxGetResourceHandle();
bRet = TRUE;
}
}
*pResult = 0;
return bRet;
}
发生的情况是,仅将鼠标放在菜单项(文件,编辑,视图,窗口,帮助(上会导致代码输入OnNeedToolTipText
,ID为0-5。将鼠标移动到工作区(视图(中不执行任何操作。
如何使工具提示仅显示在视图的工作区中?
视觉工作室 2017;C++;64 位视窗 7
为了解决这个问题,你需要执行以下操作:
BOOL CMyAppView::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_MOUSEMOVE:
if (m_pToolTip->GetSafeHwnd () != NULL)
{
m_pToolTip->RelayEvent(pMsg);
}
break;
}
return CScrollView::PreTranslateMessage(pMsg);
}
如果您希望在视图中显示跟踪工具提示,请按照以下步骤操作:
创建工具提示并添加工具。
void CToolTipDemoView::OnInitialUpdate()
{
// ...
m_toolTip.Create(this, TTS_ALWAYSTIP | TTS_NOANIMATE);
m_toolTip.AddTool(this, _T("Doesn't matter"));
}
处理WM_MOUSEMOVE消息。首先,调用_TrackMouseEvent以进一步接收WM_MOUSELEAVE并激活工具提示。其次,更新工具提示文本,并在鼠标指针坐标处显示它。
void CToolTipDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTrackingMouseLeave)
{
TRACKMOUSEEVENT tme = { 0 };
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = m_hWnd;
::_TrackMouseEvent(&tme);
m_toolTip.Activate(TRUE);
m_bTrackingMouseLeave = TRUE;
}
if (m_pointLastMousePos != point)
{
CString strText;
strText.Format(_T("x = %d y = %d"), point.x, point.y);
m_toolTip.UpdateTipText(strText, this);
m_toolTip.Popup();
m_pointLastMousePos = point;
}
CScrollView::OnMouseMove(nFlags, point);
}
处理WM_MOUSELEAVE并停用工具提示。
void CCToolTipDemoView::OnMouseLeave()
{
m_bTrackingMouseLeave = FALSE;
// mouse pointer leaves the window so deactivate the tooltip
m_toolTip.Activate(FALSE);
CScrollView::OnMouseLeave();
}
笔记:
- 不再需要处理TTN_NEEDTEXT。
- 此外,不再需要覆盖预翻译消息
所以我回去看看我可能错过了什么。我10多年前写过这些东西。我还覆盖了CWnd成员
virtual INT_PTR OnToolHitTest( CPoint point, TOOLINFO* pTI ) const;
跟:
INT_PTR HERichView::OnToolHitTest( CPoint point, TOOLINFO* pTI ) const
{
pTI->hwnd = m_hWnd;
pTI->uId = point.x + ( point.y << 16 );
CRect rect;
GetClientRect( rect );
pTI->rect= rect;
pTI->lpszText= LPSTR_TEXTCALLBACK;
return pTI->uId;
}
我检查了一下,没有这个它就行不通。所以你的:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTip )
如果您添加上述内容,应该被调用。只需要EnableToolTips( );
。
我还没有成功地让跟踪工具提示在 MFC 中工作。我最接近的是
在消息映射中:ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnNeedToolTipText)
OnInitialUpdate
:BOOL ok1 = EnableTrackingToolTips(TRUE);
在覆盖虚函数OnToolHitTest
:
pTI->hwnd = m_hWnd;
pTI->uId = (UINT_PTR)m_hWnd;
pTI->uFlags = TTF_IDISHWND | TTF_ALWAYSTIP | TTF_TRACK | TTF_NOTBUTTON | TTF_ABSOLUTE | TTF_SUBCLASS;
pTI->lpszText = LPSTR_TEXTCALLBACK;
return pTI->uId;
在OnNeedToolTipText
:
NMTTDISPINFO *pTTT = (NMTTDISPINFO *)pNMHDR;
UINT_PTR nID = pNMHDR->idFrom;
BOOL bRet = FALSE;
if(pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
if(nID)
{
CURSORINFO ci; ci.cbSize = sizeof(CURSORINFO); // get something interesting to display
GetCursorInfo(&ci);
_stprintf_s(pTTT->szText, sizeof(pTTT->szText) / sizeof(TCHAR),
_T("Control ID = %lld at (%d, %d)"), nID, ci.ptScreenPos.x, ci.ptScreenPos.y);
pTTT->hinst = AfxGetResourceHandle();
bRet = TRUE;
}
}
*pResult = 0;
return bRet;
这会产生以下特殊行为。当我启动应用程序并将鼠标光标移动到 CScrollView 的工作区时,工具提示显示在光标旁边。
如果我小心(平滑(地移动鼠标,工具提示会正确跟踪。但是,过了一会儿,它就会消失,并且没有进一步的鼠标动作(包括离开CScrollView窗口并返回(使其重新出现。
我认为正在发生的事情是,当鼠标光标移动到工具提示窗口上时,工具提示将永久关闭。这种消失似乎与时间无关(例如,由于自动弹出(;如果鼠标保持不变,则工具提示将无限期地保持。
- 如何在动态创建的CMFCToolbar的工具提示中添加描述?
- 添加带有 QSyntaxHighlight 和 QTextCharFormat 的工具提示
- CScrollView 中的跟踪工具提示?
- 当鼠标悬停在 MFC C++ 中列表控件的列标题上时,可视显示工具提示
- 在 MFC C++中悬停列表控件的列标题的可视化显示工具提示
- 在地块工具中跟踪子进程的命令
- 无法隐藏工具提示
- 更新模型/视图方案中 QXXXView (QTableView, QTreeView,..) 元素的显示工具提示
- 将工具提示添加到 ComboBoxEx 失败
- 如何在 c++/cli 中增加工具提示的大小
- QT 4.7-在OS X 10.12下,工具提示和Qcombobox弹出窗口空白
- QLineEdit:如果鼠标悬停,则显示超长文本作为工具提示
- Visual studio调试工具提示-隐藏变量
- C++Listview工具提示
- 鼠标悬停在TableView上时显示工具提示
- 如何在Qt的子小部件中忽略父小部件的工具提示?
- 如何在QToolbar上禁用工具提示
- 如何显示动态工具提示
- 如何在C++Builder中长时间显示工具提示
- c++ Windows开始菜单Internet快捷方式工具提示