|
|
@@ -650,6 +650,8 @@ namespace DuiLib
|
|
|
namespace
|
|
|
{
|
|
|
const int kScrollBarTouchSlop = 12; // 手指离滚动条 rect 的最大容差(像素)
|
|
|
+ DWORD s_dwModalTouchMouseBarrierUntil = 0;
|
|
|
+ bool s_bModalTouchMouseBarrierDownSeen = false;
|
|
|
|
|
|
// Windows 会把“触摸提升(promoted)出来的合成鼠标消息”打上 MOUSEEVENTF_FROMTOUCH 标记
|
|
|
// (位于 GetMessageExtraInfo() 的高位,MSDN 推荐判定值 0xFF515700)。
|
|
|
@@ -660,6 +662,41 @@ namespace DuiLib
|
|
|
return (::GetMessageExtraInfo() & 0xFFFFFF80) == 0xFF515700;
|
|
|
}
|
|
|
|
|
|
+ inline bool ConsumeModalTouchMouseBarrier(UINT uMsg)
|
|
|
+ {
|
|
|
+ if (s_dwModalTouchMouseBarrierUntil == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if ((LONG)(::GetTickCount() - s_dwModalTouchMouseBarrierUntil) >= 0)
|
|
|
+ {
|
|
|
+ s_dwModalTouchMouseBarrierUntil = 0;
|
|
|
+ s_bModalTouchMouseBarrierDownSeen = false;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!IsPromotedTouchMouseMessage())
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (uMsg == WM_LBUTTONDOWN)
|
|
|
+ {
|
|
|
+ s_bModalTouchMouseBarrierDownSeen = true;
|
|
|
+ TouchTrace::Log(_T("MODAL-TOUCH-BARRIER consume DOWN"));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (uMsg == WM_LBUTTONUP)
|
|
|
+ {
|
|
|
+ const bool bDownSeen = s_bModalTouchMouseBarrierDownSeen;
|
|
|
+ s_dwModalTouchMouseBarrierUntil = 0;
|
|
|
+ s_bModalTouchMouseBarrierDownSeen = false;
|
|
|
+ TouchTrace::Log(_T("MODAL-TOUCH-BARRIER consume UP and release downSeen=%d"),
|
|
|
+ (int)bDownSeen);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
// 把触点收进滚动条自身 rect:垂直滚动条主要收敛 x(y 原样保留,纵向拖拽量完好)。
|
|
|
inline POINT Touch_SnapIntoScrollBar(const CControlUI* pBar, POINT pt)
|
|
|
{
|
|
|
@@ -730,6 +767,13 @@ namespace DuiLib
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ void CPaintManagerUI::BeginModalTouchMouseBarrier()
|
|
|
+ {
|
|
|
+ s_dwModalTouchMouseBarrierUntil = ::GetTickCount() + 250;
|
|
|
+ s_bModalTouchMouseBarrierDownSeen = false;
|
|
|
+ TouchTrace::Log(_T("MODAL-TOUCH-BARRIER armed until=%u"), s_dwModalTouchMouseBarrierUntil);
|
|
|
+ }
|
|
|
+
|
|
|
void CPaintManagerUI::InitTouchSupport()
|
|
|
{
|
|
|
if (m_hWndPaint == NULL || !::IsWindow(m_hWndPaint)) return;
|
|
|
@@ -763,6 +807,7 @@ namespace DuiLib
|
|
|
// 多个控件同时高亮”的根治手段;此处再叠加 m_bSuppressHoverAfterTouch 抑制抬起后的复活。
|
|
|
TouchApi::PFN_GetTouchInputInfo pfnGetInfo = TouchApi::GetGetTouchInputInfo();
|
|
|
if (pfnGetInfo == NULL) return;
|
|
|
+ bool bTouchInputClosed = false;
|
|
|
|
|
|
UINT cInputs = LOWORD(wParam);
|
|
|
TouchTrace::Log(_T("WM_TOUCH begin inputs=%u handle=%p"), cInputs, (HANDLE)lParam);
|
|
|
@@ -1006,6 +1051,15 @@ namespace DuiLib
|
|
|
{
|
|
|
CControlUI* pClick = m_pEventClick;
|
|
|
m_pEventClick = NULL;
|
|
|
+ m_pEventTouch = NULL;
|
|
|
+ m_pTouchScrollContainer = NULL;
|
|
|
+ m_bSuppressPromotedTouchMouse = true;
|
|
|
+ TouchApi::PFN_CloseTouchInputHandle pfnClose = TouchApi::GetCloseTouchInputHandle();
|
|
|
+ if (pfnClose != NULL)
|
|
|
+ {
|
|
|
+ pfnClose((HANDLE)lParam);
|
|
|
+ bTouchInputClosed = true;
|
|
|
+ }
|
|
|
TouchTrace::Log(_T("TOUCHUP click-candidate %s cls=%s pt=%d,%d"),
|
|
|
pClick->GetName().GetData(), pClick->GetClass(), pt.x, pt.y);
|
|
|
TEventUI clickEvent = { 0 };
|
|
|
@@ -1034,7 +1088,7 @@ namespace DuiLib
|
|
|
}
|
|
|
|
|
|
TouchApi::PFN_CloseTouchInputHandle pfnClose = TouchApi::GetCloseTouchInputHandle();
|
|
|
- if (pfnClose != NULL)
|
|
|
+ if (!bTouchInputClosed && pfnClose != NULL)
|
|
|
pfnClose((HANDLE)lParam);
|
|
|
}
|
|
|
|
|
|
@@ -1665,6 +1719,9 @@ namespace DuiLib
|
|
|
// 无条件拦截会导致模态窗口完全无法触摸点击。
|
|
|
if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDBLCLK)
|
|
|
{
|
|
|
+ if (ConsumeModalTouchMouseBarrier(uMsg))
|
|
|
+ return true;
|
|
|
+
|
|
|
if (m_pEventTouch != NULL || m_bSuppressPromotedTouchMouse)
|
|
|
{
|
|
|
if (uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDBLCLK)
|