|
|
@@ -623,6 +623,8 @@ namespace DuiLib
|
|
|
if (pControl->GetManager() != this) break;
|
|
|
|
|
|
m_pEventTouch = pControl;
|
|
|
+ m_bTouchMoved = false;
|
|
|
+ m_ptTouchStart = pt;
|
|
|
pControl->SetFocus();
|
|
|
SetCapture(); // mgr 级:m_bMouseCapture=true + ::SetCapture
|
|
|
|
|
|
@@ -644,6 +646,11 @@ namespace DuiLib
|
|
|
LONG dx = pt.x - m_ptLastTouchPos.x;
|
|
|
LONG dy = pt.y - m_ptLastTouchPos.y;
|
|
|
m_ptLastTouchPos = pt;
|
|
|
+ // 相对手势起点的累计位移超过阈值 -> 判定为拖拽(用于松开时抑制点击)
|
|
|
+ LONG ox = pt.x - m_ptTouchStart.x;
|
|
|
+ LONG oy = pt.y - m_ptTouchStart.y;
|
|
|
+ if (ox > 5 || ox < -5 || oy > 5 || oy < -5)
|
|
|
+ m_bTouchMoved = true;
|
|
|
if (m_pEventTouch == NULL) break;
|
|
|
|
|
|
TEventUI event = { 0 };
|
|
|
@@ -1238,10 +1245,10 @@ namespace DuiLib
|
|
|
if (m_hWndPaint == NULL) return false;
|
|
|
|
|
|
// [触屏兼容] 不再过滤 Windows 为触摸模拟的鼠标消息(MOUSEEVENTF_FROMTOUCH)。
|
|
|
- // 100% 照搬 NIM Duilib:触摸的“点击”正来自这些模拟的 WM_LBUTTONDOWN/UP,
|
|
|
- // 由 MessageHandler 原生鼠标路径交给 CButtonUI 等控件 Activate() 触发。
|
|
|
- // 为防止一次手指手势既滚动又点击,仅在 WM_LBUTTON*/WM_MOUSEMOVE 分支加了
|
|
|
- // `if (m_pEventTouch != NULL) return;` 守卫(手势进行中 m_pEventTouch 非空)。
|
|
|
+ // 触摸的“点击”正来自这些模拟的 WM_LBUTTONDOWN/UP,由原生鼠标路径交给 CButtonUI 等控件
|
|
|
+ // Activate() 触发——而 DuiLib 的点击状态机依赖 WM_LBUTTONDOWN 设置 m_pEventClick,故绝不能
|
|
|
+ // 在鼠标分支吞掉这些模拟消息(之前那样做会导致触摸与鼠标点击全失效)。
|
|
|
+ // 为避免“拖拽=滚动”又“误点按钮”,改用 m_bTouchMoved:若本次手势发生位移,在 WM_LBUTTONUP 抑制点击。
|
|
|
|
|
|
// Cycle through listeners
|
|
|
for (int i = 0; i < m_aMessageFilters.GetSize(); i++)
|
|
|
@@ -1838,8 +1845,6 @@ namespace DuiLib
|
|
|
break;
|
|
|
case WM_MOUSEMOVE:
|
|
|
{
|
|
|
- // 触屏手势进行中 -> 忽略模拟鼠标移动(NIM 同款守卫)
|
|
|
- if (m_pEventTouch != NULL) { lRes = 0; return true; }
|
|
|
// Start tracking this entire window again...
|
|
|
if (!m_bMouseTracking)
|
|
|
{
|
|
|
@@ -1979,8 +1984,6 @@ namespace DuiLib
|
|
|
break;
|
|
|
case WM_LBUTTONDOWN:
|
|
|
{
|
|
|
- // 触屏手势进行中 -> 忽略模拟鼠标,避免“既滚动又点击”双触发(NIM 同款守卫)
|
|
|
- if (m_pEventTouch != NULL) { lRes = 0; return true; }
|
|
|
// We alway set focus back to our app (this helps
|
|
|
// when Win32 child windows are placed on the dialog
|
|
|
// and we need to remove them on focus change).
|
|
|
@@ -2024,8 +2027,6 @@ namespace DuiLib
|
|
|
break;
|
|
|
case WM_LBUTTONDBLCLK:
|
|
|
{
|
|
|
- // 触屏手势进行中 -> 忽略模拟鼠标(NIM 同款守卫)
|
|
|
- if (m_pEventTouch != NULL) { lRes = 0; return true; }
|
|
|
if (!m_bNoActivate) ::SetFocus(m_hWndPaint);
|
|
|
|
|
|
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
|
|
|
@@ -2048,8 +2049,9 @@ namespace DuiLib
|
|
|
break;
|
|
|
case WM_LBUTTONUP:
|
|
|
{
|
|
|
- // 触屏手势进行中 -> 忽略模拟鼠标(NIM 同款守卫)
|
|
|
- if (m_pEventTouch != NULL) { lRes = 0; return true; }
|
|
|
+ // 触屏拖拽手势(已发生位移)-> 松开不触发点击,仅滚动(避免“拖拽又误点”)
|
|
|
+ if (m_bTouchMoved) m_pEventClick = NULL;
|
|
|
+ m_bTouchMoved = false; // 用完即清,绝不影响后续真实鼠标点击
|
|
|
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
|
|
|
m_ptLastMousePos = pt;
|
|
|
if (m_pEventClick == NULL) break;
|