张洋 4 weeks ago
parent
commit
d2a0860769
1 changed files with 24 additions and 1 deletions
  1. 24 1
      DuiLib/Core/UIManager.cpp

+ 24 - 1
DuiLib/Core/UIManager.cpp

@@ -622,6 +622,12 @@ namespace DuiLib
 				if (pControl == NULL) break;
 				if (pControl->GetManager() != this) break;
 
+				// 滚动条:滑块拖拽/点击由原生鼠标路径(模拟的 WM_LBUTTONDOWN/MOVE/UP)驱动;
+				// 若此处再派发 UIEVENT_TOUCHMOVE 会冒泡到容器把【内容】滚走,与滑块拖拽打架→滑块拖不动、点轨道误翻页。
+				// 直接交回原生鼠标,本函数提前退出(悬浮态由 WM_TOUCH UP 统一清理)。
+				if (pControl->GetInterface(_T("ScrollBar")) != NULL)
+					break;
+
 				m_pEventTouch = pControl;
 				m_bTouchMoved = false;
 				m_ptTouchStart = pt;
@@ -666,9 +672,26 @@ namespace DuiLib
 			else if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_UP)
 			{
 				m_ptLastTouchPos = pt;
-				ReleaseCapture();
+
+				// 触屏抬起模拟“鼠标离开”:清除悬浮态。触摸不会生成 WM_MOUSELEAVE,
+				// 否则按钮/列表项点击后悬浮态残留。滚动条等提前退出的触点 m_pEventTouch 为 NULL,同样要清。
+				if (m_pEventHover != NULL)
+				{
+					TEventUI event = { 0 };
+					event.Type = UIEVENT_MOUSELEAVE;
+					event.pSender = m_pEventHover;
+					event.ptMouse = pt;
+					event.wKeyState = MapKeyState();
+					event.dwTimestamp = ::GetTickCount();
+					m_pEventHover->Event(event);
+					m_pEventHover = NULL;
+				}
+
+				// 滚动条等场景本函数未接管(m_pEventTouch 为 NULL),捕获由原生鼠标路径负责,这里不释放。
 				if (m_pEventTouch == NULL) break;
 
+				ReleaseCapture();
+
 				TEventUI event = { 0 };
 				event.Type = UIEVENT_TOUCHUP;
 				event.pSender = m_pEventTouch;