跟踪滚动条上的鼠标事件
Tracking mouse events on scrollbar
我有一个组件,它被细分为对话框,我在该组件中处理鼠标事件。我试图实现的是根据鼠标事件更改滚动条的可见性(即,只有当鼠标悬停在该区域时,滚动条才会出现(。我在WM_MOUSEMOVE
消息上处理TrackMouseEvent
,在WM_MOUSEHOVER
和WM_MOUSELEAVE
上分别使用ShowScrollBar
。
除了鼠标悬停在滚动条上时,它可以按预期工作。它不断地发送WM_MOUSEHOVER
和WM_MOUSELEAVE
消息,整个区域闪烁,就像每秒都被重新绘制一样。
我不太确定ShowScrollbar
和TrackMouseEvent
的行为。有人能帮我找到解决这个问题的方法吗?
我的应用程序是在没有MFC的Win32下开发的,下面是我的一小段代码。
// gets called once on initialize
void CUDComment::InitScrollRange(int cyWindow)
{
int nTotal = _getTotalItemHeight();
int nRangeY = nTotal - cyWindow + _getItemHeight();
if( nRangeY < 0 ) nRangeY = 0;
if( m_nVerPos >= nRangeY )
{
m_nVerPos = nRangeY;
}
DWORD dwScrollState = 0;
// Hide scrollbar when the content is just one line
if( nTotal > cyWindow )
{
dwScrollState = 1;
m_bShowScroll = TRUE;
}
else
{
if( m_bShowScroll )
{
dwScrollState = 2;
m_bShowScroll = FALSE;
}
}
if( dwScrollState > 0 )
{
SCROLLINFO siVer;
siVer.cbSize = sizeof(SCROLLINFO);
siVer.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
siVer.nMin = 0;
if( dwScrollState == 2 )
{
siVer.nMax = 0;
siVer.nPage = 0;
siVer.nPos = 0;
}
else
{
siVer.nMax = nRangeY;
siVer.nPage = min(nRangeY, (int)_getItemHeight());
siVer.nPos = m_nVerPos;
}
SetScrollInfo(m_hWnd, SB_VERT, &siVer, TRUE);
}
}
void CUDComment::OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if( !m_bTracking )
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 500;
m_bTracking = TrackMouseEvent(&tme);
}
}
void CUDComment::OnMouseHover(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
ShowScrollBar(m_hWnd, SB_VERT, TRUE);
}
void CUDComment::OnMouseLeave(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
m_bTracking = FALSE;
ShowScrollBar(m_hWnd, SB_VERT, FALSE);
}
我尝试了Johnathan的方法,但当我为TrackMouseEvent
设置TME_LEAVE
和TME_NONCLIENT
触发器时,它不太起作用。我无法让鼠标捕捉非客户端区域。我所做的基本上是计算滚动条的大小(GetSystemMetrics(SM_CXVSCROLL)
(及其坐标,然后在鼠标悬停在滚动条区域时忽略留言。因此,在处理WM_MOUSELEAVE
消息时,我基本上创建了一个异常情况。
除了我的OnMouseLeave
函数外,总体代码看起来相似。
void CUDComment::OnMouseLeave(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
POINT ptCurrent;
GetCursorPos(&ptCurrent);
ScreenToClient(hWnd, &ptCurrent);
if (!PtInRect(&m_rcScrollbar, ptCurrent))
{
ShowScrollBar(hWnd, SB_VERT, FALSE);
m_bTracking = FALSE;
}
}
相关文章:
- 跟踪滚动条上的鼠标事件
- Qt-如何在Qt3DWindow上获取鼠标事件
- Qt:如何防止为平板电脑事件生成鼠标事件
- 如何使用 c++ mfc 在屏幕上获取鼠标事件
- WM_PAINT和鼠标事件.MFC/WIN32 API.
- 通过鼠标事件传递数据
- 鼠标区域窃取QQuickItem的鼠标事件
- Windows Console API鼠标事件只是进入选择模式
- 无法跟踪鼠标事件 OpenCV
- Qt. 忽略小部件中的任何鼠标事件,而不是另一个小部件
- WXWIDGETS将鼠标事件连接到WXPAINTDC上的形状对象以删除
- Qt/Qml - 触发 QApplication/QQmlApplicationEngine 事件(键和鼠标事件)
- Juce 鼠标事件不起作用
- 是否可以捕获全局鼠标事件
- 单击QCHART图的轴时捕获鼠标事件
- OpenCV 鼠标事件始终在鼠标滚动时接收事件 10 和 *flag* 0
- 鼠标事件选取器打开场景图
- 将鼠标事件发送到虚拟现实OpenGL场景中的QtQuick窗口
- 处理鼠标事件SFML
- 是否可以在 wxFrame 中捕获鼠标事件