|
|
@@ -95,72 +95,17 @@ namespace DuiLib
|
|
|
}
|
|
|
}
|
|
|
// ---------------------------------------------------------------------------
|
|
|
- // [触屏诊断] 保留日志入口以便后续定位,但当前默认关闭。
|
|
|
+ // [触屏诊断] 日志出口已**统一到 `DuiLibDiag`**(Utils/UIDiag.h/.cpp)。
|
|
|
+ //
|
|
|
+ // 原先这里有一份 `namespace TouchTrace { void Log(LPCTSTR, ...); }` 的本地实现,
|
|
|
+ // 与 UIDiag 的写法(`[tick][tid] 文本`、UTF-8、追加写 exe 同目录 touch_trace.log、
|
|
|
+ // 32MB 封顶)完全重复,且因为处于**匿名 namespace** 而无法被别的 .cpp 引用
|
|
|
+ // —— 这正是当初另起 UIDiag 的原因。
|
|
|
+ //
|
|
|
+ // 现在本文件(以及 UIBase.cpp / UIButton.cpp)的所有诊断调用一律写
|
|
|
+ // `DuiLibDiag::Log(...)`,只有 UIDiag.cpp 一处真正落盘。
|
|
|
+ // 关日志 / 改路径 / 改封顶值 ⇒ **只改 UIDiag.cpp 的 Enabled()**,不要在本文件加实现。
|
|
|
// ---------------------------------------------------------------------------
|
|
|
- namespace TouchTrace
|
|
|
- {
|
|
|
- inline bool Enabled()
|
|
|
- {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- // 极简 TCHAR* → UTF-8 char* 转换(仅用于日志路径;非线程安全,够用即可)
|
|
|
- inline const char* Narrow(LPCTSTR s)
|
|
|
- {
|
|
|
- static char s_buf[MAX_PATH * 3] = { 0 };
|
|
|
-#ifdef _UNICODE
|
|
|
- s_buf[0] = '\0';
|
|
|
- if (s != NULL)
|
|
|
- ::WideCharToMultiByte(CP_UTF8, 0, s, -1, s_buf, (int)sizeof(s_buf) - 1, NULL, NULL);
|
|
|
- return s_buf;
|
|
|
-#else
|
|
|
- return s;
|
|
|
-#endif
|
|
|
- }
|
|
|
-
|
|
|
- void Log(LPCTSTR fmt, ...)
|
|
|
- {
|
|
|
- if (!Enabled()) return;
|
|
|
-
|
|
|
- TCHAR path[MAX_PATH] = { 0 };
|
|
|
- ::GetModuleFileName(NULL, path, MAX_PATH);
|
|
|
- TCHAR* p = _tcsrchr(path, _T('\\'));
|
|
|
- if (p != NULL) *(p + 1) = _T('\0');
|
|
|
- _tcscat_s(path, MAX_PATH, _T("touch_trace.log"));
|
|
|
-
|
|
|
- TCHAR msg[1024] = { 0 };
|
|
|
- va_list ap;
|
|
|
- va_start(ap, fmt);
|
|
|
- _vsntprintf_s(msg, _countof(msg), _TRUNCATE, fmt, ap);
|
|
|
- va_end(ap);
|
|
|
-
|
|
|
- // 统一转 UTF-8 写盘(Unicode/ANSI 工程都能用文本编辑器正常查看)
|
|
|
- char utf8[2048] = { 0 };
|
|
|
-#ifdef _UNICODE
|
|
|
- if (::WideCharToMultiByte(CP_UTF8, 0, msg, -1, utf8, (int)sizeof(utf8) - 1, NULL, NULL) <= 0)
|
|
|
- return;
|
|
|
-#else
|
|
|
- _tcscpy_s(utf8, _countof(utf8), msg);
|
|
|
-#endif
|
|
|
- FILE* f = NULL;
|
|
|
- // 保护:单个日志超过 32MB 就不再追加,避免在收银机上长期运行把日志写到失控。
|
|
|
- // (全量 INPUT-TRACE 很啰嗦,阈值从 4MB 放宽到 32MB,否则一轮诊断还没跑完就静默停写了。)
|
|
|
- // 注意:GetFileAttributesEx 是 TCHAR 宏(Unicode 工程下展开为 ...ExW),
|
|
|
- // 必须传 TCHAR 的 path,不能传 Narrow(path) 得到的 UTF-8 char*(否则 C2664)。
|
|
|
- WIN32_FILE_ATTRIBUTE_DATA fad = { 0 };
|
|
|
- if (::GetFileAttributesEx(path, GetFileExInfoStandard, &fad)
|
|
|
- && fad.nFileSizeHigh == 0 && fad.nFileSizeLow >= (32u * 1024u * 1024u))
|
|
|
- return;
|
|
|
- // fopen_s 只吃 char*(窄字符路径),这里才需要 UTF-8 的 Narrow(path)
|
|
|
- if (fopen_s(&f, Narrow(path), "a") == 0 && f != NULL)
|
|
|
- {
|
|
|
- fprintf(f, "[%8u][T%5u] %s\n", (unsigned)::GetTickCount(), (unsigned)::GetCurrentThreadId(), utf8);
|
|
|
- // 立刻冲盘:程序被强杀 / 挂死 / 断电时,日志尾部(往往正是关键现场)不能丢。
|
|
|
- fflush(f);
|
|
|
- fclose(f);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
static void GetChildWndRect(HWND hWnd, HWND hChildWnd, RECT& rcChildWnd)
|
|
|
{
|
|
|
@@ -492,7 +437,7 @@ namespace DuiLib
|
|
|
if (dwLen > 0 && dwLen < _countof(szBuf) && szBuf[0] == _T('1'))
|
|
|
{
|
|
|
m_bRelayDefProcForTouchMove = true;
|
|
|
- TouchTrace::Log(_T("DEFPROC-RELAY enabled by env (DUI_RELAY_DEFPROC=1)"));
|
|
|
+ DuiLibDiag::Log(_T("DEFPROC-RELAY enabled by env (DUI_RELAY_DEFPROC=1)"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -646,7 +591,7 @@ namespace DuiLib
|
|
|
}
|
|
|
const int nIndex = m_aPreMessages.Find(this);
|
|
|
if (nIndex >= 0) m_aPreMessages.Remove(nIndex);
|
|
|
- TouchTrace::Log(_T("MANAGER-DETACH manager=%p from hwnd=%p"), (void*)this, (void*)m_hWndPaint);
|
|
|
+ DuiLibDiag::Log(_T("MANAGER-DETACH manager=%p from hwnd=%p"), (void*)this, (void*)m_hWndPaint);
|
|
|
// 注意:m_hWndPaint 暂不置空 —— AttachPaintWindow 会覆盖它。
|
|
|
// 也不要清空控件树 / 字体 / 图片:那些是"内容",迁移后要继续用。
|
|
|
}
|
|
|
@@ -719,7 +664,7 @@ namespace DuiLib
|
|
|
// 新窗口必须注册触摸,否则收不到 WM_TOUCH。
|
|
|
InitTouchSupport();
|
|
|
|
|
|
- TouchTrace::Log(_T("MANAGER-ATTACH manager=%p to hwnd=%p dc=%p (input-state reset)"),
|
|
|
+ DuiLibDiag::Log(_T("MANAGER-ATTACH manager=%p to hwnd=%p dc=%p (input-state reset)"),
|
|
|
(void*)this, (void*)m_hWndPaint, (void*)m_hDcPaint);
|
|
|
}
|
|
|
|
|
|
@@ -1120,7 +1065,7 @@ namespace DuiLib
|
|
|
if (hModal == NULL || !::IsWindow(hModal)) return; // 无模态:沉默
|
|
|
if (hWnd == hModal) return; // 弹框自己:沉默(正常)
|
|
|
HWND hOwner = ::GetWindow(hModal, GW_OWNER);
|
|
|
- DuiLib::TouchTrace::Log(_T("MODAL-GATE-CHECK where=%s self=%p modal=%p ownerOfModal=%p selfIsOwner=%d"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-GATE-CHECK where=%s self=%p modal=%p ownerOfModal=%p selfIsOwner=%d"),
|
|
|
pszWhere, (void*)hWnd, (void*)hModal, (void*)hOwner,
|
|
|
(int)(hOwner == hWnd));
|
|
|
}
|
|
|
@@ -1207,7 +1152,7 @@ namespace DuiLib
|
|
|
void CPaintManagerUI::SetModalWindow(HWND hWnd)
|
|
|
{
|
|
|
s_hModalWindow = hWnd;
|
|
|
- TouchTrace::Log(_T("MODAL-WINDOW set hwnd=%p"), (void*)hWnd);
|
|
|
+ DuiLibDiag::Log(_T("MODAL-WINDOW set hwnd=%p"), (void*)hWnd);
|
|
|
}
|
|
|
|
|
|
HWND CPaintManagerUI::GetModalWindow()
|
|
|
@@ -1223,7 +1168,7 @@ namespace DuiLib
|
|
|
BOOL bRegistered = FALSE;
|
|
|
if (pfnRegister != NULL)
|
|
|
bRegistered = pfnRegister(m_hWndPaint, 0);
|
|
|
- TouchTrace::Log(_T("REGISTER hwnd=%p manager=%p result=%d error=%u style=0x%08X ex=0x%08X"),
|
|
|
+ DuiLibDiag::Log(_T("REGISTER hwnd=%p manager=%p result=%d error=%u style=0x%08X ex=0x%08X"),
|
|
|
(void*)m_hWndPaint, (void*)this, (int)bRegistered, bRegistered ? 0u : ::GetLastError(),
|
|
|
(unsigned)::GetWindowLong(m_hWndPaint, GWL_STYLE),
|
|
|
(unsigned)::GetWindowLong(m_hWndPaint, GWL_EXSTYLE));
|
|
|
@@ -1262,7 +1207,7 @@ namespace DuiLib
|
|
|
// ===========================================================================
|
|
|
void CPaintManagerUI::BeginTouchSlideGesture(POINT pt)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("SLIDE-BEGIN pt=%d,%d"), pt.x, pt.y);
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-BEGIN pt=%d,%d"), pt.x, pt.y);
|
|
|
|
|
|
m_ptLastTouchPos = pt;
|
|
|
// 触摸没有"悬浮"语义。新手势开始前先清掉上一次鼠标路径遗留的 HOT 状态,
|
|
|
@@ -1284,14 +1229,14 @@ namespace DuiLib
|
|
|
CControlUI* pControl = FindControl(pt);
|
|
|
if (pControl == NULL)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("SLIDE-BEGIN no control pt=%d,%d"), pt.x, pt.y);
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-BEGIN no control pt=%d,%d"), pt.x, pt.y);
|
|
|
// 没命中控件也要保持 active:随后的 Update 仍需被安全吸收掉,
|
|
|
// 由 End 统一收尾(否则 Update 会跑到空指针上)。
|
|
|
return;
|
|
|
}
|
|
|
if (pControl->GetManager() != this)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("SLIDE-BEGIN foreign control=%s manager=%p self=%p"),
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-BEGIN foreign control=%s manager=%p self=%p"),
|
|
|
pControl->GetName().GetData(), (void*)pControl->GetManager(), (void*)this);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1305,7 +1250,7 @@ namespace DuiLib
|
|
|
pBar = Touch_ResolveScrollBarThumb(pControl, pt);
|
|
|
if (pBar != NULL)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("SLIDE-BEGIN-FATFINGER hit=%s -> scrollbar=%s pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-BEGIN-FATFINGER hit=%s -> scrollbar=%s pt=%d,%d"),
|
|
|
pControl->GetName().GetData(), pBar->GetName().GetData(), pt.x, pt.y);
|
|
|
pControl = pBar;
|
|
|
}
|
|
|
@@ -1316,7 +1261,7 @@ namespace DuiLib
|
|
|
// 但 m_ptLastTouchPos / m_ptTouchStart 仍记真实坐标(去重与位移判定按真实手指轨迹走)。
|
|
|
const POINT ptEvent = bTouchIsScrollBar ? Touch_SnapIntoScrollBar(pControl, pt) : pt;
|
|
|
|
|
|
- TouchTrace::Log(_T("SLIDE-BEGIN hit=%s cls=%s scrollbar=%d scrollContainer=%p ptEvent=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-BEGIN hit=%s cls=%s scrollbar=%d scrollContainer=%p ptEvent=%d,%d"),
|
|
|
pControl->GetName().GetData(), pControl->GetClass(), (int)bTouchIsScrollBar,
|
|
|
(void*)Touch_FindScrollContainer(pControl), ptEvent.x, ptEvent.y);
|
|
|
|
|
|
@@ -1398,6 +1343,21 @@ namespace DuiLib
|
|
|
// (手指划过屏幕的位移通常数十至数百像素)必然超过。
|
|
|
//
|
|
|
// ⚠️ 若要调整,只改这一个常量 —— 两条通道共用本函数,改一处即全局生效。
|
|
|
+ //
|
|
|
+ // ⚠️⚠️【不要擅自再加"单包位移"判据 —— 已评估后主动放弃】⚠️⚠️
|
|
|
+ // 动机看似合理:真机日志里"快速划动"时前两包累计才 11px、
|
|
|
+ // 第三包单包突然 55px,若按单包判能提前 ~60ms 判定为滑动。
|
|
|
+ // 但必须意识到:`m_bTouchMoved` **不只是**"清扫按压态的时机",
|
|
|
+ // 它同时是**"这次手势算不算点击"的唯一判据**(见 EndTouchSlideGesture
|
|
|
+ // 的 `bTapLike = !m_bTouchMoved`)。
|
|
|
+ // ⇒ 放宽它 = 放宽"点击被误判为滑动"的口径 = 有概率让**正常点击点不动**。
|
|
|
+ // 而当前真机日志里 13 次手势中**只有 1 次真实点击**(其余全是有意滑动),
|
|
|
+ // **样本不足以评估点击侧风险**。
|
|
|
+ // ⇒ 在没有"点击被误判"的直接证据前,绝不动这个判据。
|
|
|
+ // (历史教训同源:曾为"理论风险"收窄判据,结果真机主路径直接失效。)
|
|
|
+ // 清扫时机已经由"抬手"提前到"越过阈值那一帧"(157ms → ~78ms),
|
|
|
+ // 这已解决用户可感知的问题;剩余 ~78ms 是"区分点/滑"的**固有代价**,
|
|
|
+ // 不可能再压缩 —— DOWN 那一刻本来就不可能知道用户要干什么。
|
|
|
static const LONG kTouchDragThresholdPx = 16;
|
|
|
if (ox > kTouchDragThresholdPx || ox < -kTouchDragThresholdPx
|
|
|
|| oy > kTouchDragThresholdPx || oy < -kTouchDragThresholdPx)
|
|
|
@@ -1405,7 +1365,7 @@ namespace DuiLib
|
|
|
|
|
|
if (m_pEventTouch == NULL) return;
|
|
|
|
|
|
- TouchTrace::Log(_T("SLIDE-MOVE touch=%s cls=%s d=%d,%d moved=%d click=%s"),
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-MOVE touch=%s cls=%s d=%d,%d moved=%d click=%s"),
|
|
|
m_pEventTouch->GetName().GetData(), m_pEventTouch->GetClass(),
|
|
|
(int)dx, (int)dy, (int)m_bTouchMoved,
|
|
|
m_pEventClick != NULL ? m_pEventClick->GetName().GetData() : _T("null"));
|
|
|
@@ -1458,7 +1418,7 @@ namespace DuiLib
|
|
|
evWheel.ptMouse = pt;
|
|
|
evWheel.wKeyState = MapKeyState();
|
|
|
evWheel.dwTimestamp = ::GetTickCount();
|
|
|
- TouchTrace::Log(_T("SLIDE-MOVE->WHEEL control=%s zDelta=%d pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-MOVE->WHEEL control=%s zDelta=%d pt=%d,%d"),
|
|
|
pWheel->GetName().GetData(), zDelta, pt.x, pt.y);
|
|
|
pWheel->Event(evWheel);
|
|
|
}
|
|
|
@@ -1493,11 +1453,10 @@ namespace DuiLib
|
|
|
// [NIM 风格] 这里不需要"解除让路"——让路已改由 m_pEventTouch 这个**标记**表达。
|
|
|
// ⚠️ 可变参数必须在 _T 宏的括号**之外**:_T 是单参数宏,
|
|
|
// 若把格式化参数一起写进它的括号里,会触发 C4002「类函数宏的调用参数过多」。
|
|
|
- TouchTrace::Log(_T("SLIDE-END no-control pt=%d,%d (not a tap)"), pt.x, pt.y);
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-END no-control pt=%d,%d (not a tap)"), pt.x, pt.y);
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- TouchTrace::Log(_T("SLIDE-END pt=%d,%d touch=%s moved=%d"),
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-END pt=%d,%d touch=%s moved=%d"),
|
|
|
pt.x, pt.y,
|
|
|
m_pEventTouch->GetName().GetData(),
|
|
|
(int)m_bTouchMoved);
|
|
|
@@ -1561,6 +1520,48 @@ namespace DuiLib
|
|
|
m_bSuppressHoverAfterTouch = true;
|
|
|
m_bMouseTracking = false;
|
|
|
|
|
|
+ // ------------------------------------------------------------------
|
|
|
+ // ★【滑动起手的按压态】手指"划着走"时,按下瞬间命中的那个控件不能留按压态。
|
|
|
+ //
|
|
|
+ // 现象(用户实测):手指触屏滑动,起手碰到的控件虽然不会触发点击,
|
|
|
+ // 但会留下按压态背景(滑完才被别的东西擦掉,或一直留着)。
|
|
|
+ //
|
|
|
+ // 成因:BeginTouchSlideGesture 在 DOWN 时**无条件**派发 UIEVENT_TOUCHDOWN,
|
|
|
+ // 控件(如 CButtonUI::DoEvent)据此置 UISTATE_PUSHED|UISTATE_CAPTURED 并
|
|
|
+ // Invalidate ⇒ 手指还没滑出控件之前,按压态已经画出来了。
|
|
|
+ // 而 UP 时这里派发的 UIEVENT_TOUCHUP 只清"抬手点所在控件"的状态:
|
|
|
+ // · CButtonUI 的 TOUCHUP 分支虽然清 PUSHED|CAPTURED,但它**不判 PtInRect**,
|
|
|
+ // 看似能清掉 —— 问题在于它只发给 m_pEventTouch(起手命中的控件),
|
|
|
+ // 而滚动场景下 UpdateTouchSlideGesture 把 TOUCHMOVE 改发给了
|
|
|
+ // m_pTouchScrollContainer,TOUCHUP 与 TOUCHMOVE 的收件人不一致,
|
|
|
+ // 一旦两个标记不指向同一对象,起手控件就**收不到 TOUCHUP**
|
|
|
+ // ⇒ PUSHED|CAPTURED 永久残留 ⇒ 按压态背景不消失。
|
|
|
+ //
|
|
|
+ // 修法:判定为滑动时,把起手控件(以及滚动容器)的按压视觉清扫掉,
|
|
|
+ // 走 ClearPushedStateAt 的窄路径(只清视觉、不发通知)。
|
|
|
+ //
|
|
|
+ // ⚠️ 顺序是死线:必须在 TOUCHUP 派发**之前**清。
|
|
|
+ // `ClearPushedStateAt` 会清 CButtonUI 的 UISTATE_CAPTURED,而那正是
|
|
|
+ // `UIEVENT_BUTTONUP` 分支的守卫(`if ((m_uButtonState & UISTATE_CAPTURED) != 0)`)。
|
|
|
+ // 放在 TOUCHUP 之后清,会连带把"轻点合成点击"必需的 CAPTURED 一起清掉
|
|
|
+ // ⇒ 按钮 Activate 不触发。但本分支只在 m_bTouchMoved(已判为滑动、不会合成点击)
|
|
|
+ // 时才进入,所以是安全的。
|
|
|
+ //
|
|
|
+ // ⚠️ 必须在下面 `m_pEventTouch = NULL` **之前**调用 —— 要用到起手控件。
|
|
|
+ // ------------------------------------------------------------------
|
|
|
+ if (m_bTouchMoved)
|
|
|
+ {
|
|
|
+ CControlUI* pSlideOrigin = m_pEventTouch;
|
|
|
+ CControlUI* pSlideScroll = m_pTouchScrollContainer;
|
|
|
+ ClearPushedStateAt(pSlideOrigin, pt);
|
|
|
+ if (pSlideScroll != NULL && pSlideScroll != pSlideOrigin)
|
|
|
+ ClearPushedStateAt(pSlideScroll, pt);
|
|
|
+ DuiLibDiag::Log(_T("SLIDE-END clear-pushed origin=%s scroll=%s pt=%d,%d"),
|
|
|
+ pSlideOrigin != NULL ? pSlideOrigin->GetName().GetData() : _T("null"),
|
|
|
+ pSlideScroll != NULL ? pSlideScroll->GetName().GetData() : _T("null"),
|
|
|
+ pt.x, pt.y);
|
|
|
+ }
|
|
|
+
|
|
|
// ⚠️⚠️ 【必须在返回之前清掉 m_pEventTouch】—— 这是"主窗口触摸点击全灭"的元凶之一。⚠️⚠️
|
|
|
//
|
|
|
// 死锁链条(每一步都真实存在):
|
|
|
@@ -1685,7 +1686,7 @@ namespace DuiLib
|
|
|
// 说明这是同一次触摸的另一条通道送来的一份重复消息 —— 整条忽略,绝不能双份驱动。
|
|
|
if (m_bPointerGestureActive)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("WM_TOUCH ignored (pointer channel owns this gesture) hwnd=%p inputs=%u"),
|
|
|
+ DuiLibDiag::Log(_T("WM_TOUCH ignored (pointer channel owns this gesture) hwnd=%p inputs=%u"),
|
|
|
(void*)m_hWndPaint, (unsigned)LOWORD(wParam));
|
|
|
return;
|
|
|
}
|
|
|
@@ -1710,7 +1711,7 @@ namespace DuiLib
|
|
|
// ------------------------------------------------------------------
|
|
|
if (IsModalBackdropWindow(m_hWndPaint))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("MODAL-BACKDROP swallow WM_TOUCH hwnd=%p modal=%p inputs=%u"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-BACKDROP swallow WM_TOUCH hwnd=%p modal=%p inputs=%u"),
|
|
|
(void*)m_hWndPaint, (void*)CPaintManagerUI::GetModalWindow(), (unsigned)LOWORD(wParam));
|
|
|
// 顺手清掉可能残留的滑动/候选点击(上一次手势若被异常中断)。
|
|
|
// 不派发 TOUCHUP、不派发点击 —— 背景窗口此刻不该有任何交互反应。
|
|
|
@@ -1730,16 +1731,16 @@ namespace DuiLib
|
|
|
bool bTouchInputClosed = false;
|
|
|
|
|
|
UINT cInputs = LOWORD(wParam);
|
|
|
- TouchTrace::Log(_T("WM_TOUCH begin inputs=%u handle=%p"), cInputs, (HANDLE)lParam);
|
|
|
+ DuiLibDiag::Log(_T("WM_TOUCH begin inputs=%u handle=%p"), cInputs, (HANDLE)lParam);
|
|
|
if (cInputs == 0)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("WM_TOUCH ignored: inputs=0"));
|
|
|
+ DuiLibDiag::Log(_T("WM_TOUCH ignored: inputs=0"));
|
|
|
return;
|
|
|
}
|
|
|
std::vector<TouchApi::TOUCHINPUT> inputs(cInputs);
|
|
|
if (!pfnGetInfo((HANDLE)lParam, cInputs, inputs.data(), (int)sizeof(TouchApi::TOUCHINPUT)))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("WM_TOUCH GetTouchInputInfo failed error=%u"), ::GetLastError());
|
|
|
+ DuiLibDiag::Log(_T("WM_TOUCH GetTouchInputInfo failed error=%u"), ::GetLastError());
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -1750,12 +1751,12 @@ namespace DuiLib
|
|
|
// BeginTouchSlideGesture 会置 m_pEventTouch,指针通道看到它非空就退让。
|
|
|
// 标记的生命周期与"WM_TOUCH 是否真的接管了本次手势"严格一致 ——
|
|
|
// 这比时间戳可靠(时间戳会因为"指针通道自己也写它"而恒真,已踩过)。
|
|
|
- TouchTrace::Log(_T("WM_TOUCH owns this gesture (pointer channel will see m_pEventTouch) hwnd=%p"), (void*)m_hWndPaint);
|
|
|
+ DuiLibDiag::Log(_T("WM_TOUCH owns this gesture (pointer channel will see m_pEventTouch) hwnd=%p"), (void*)m_hWndPaint);
|
|
|
|
|
|
for (UINT i = 0; i < cInputs; ++i)
|
|
|
{
|
|
|
TouchApi::TOUCHINPUT& ti = inputs[i];
|
|
|
- TouchTrace::Log(_T("WM_TOUCH input[%u] id=%u flags=0x%08X screen=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("WM_TOUCH input[%u] id=%u flags=0x%08X screen=%d,%d"),
|
|
|
i, ti.dwID, ti.dwFlags, TOUCH_COORD_TO_PIXEL(ti.x), TOUCH_COORD_TO_PIXEL(ti.y));
|
|
|
|
|
|
POINT pt;
|
|
|
@@ -1765,7 +1766,7 @@ namespace DuiLib
|
|
|
|
|
|
if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_DOWN)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("TOUCHDOWN begin id=%u client=%d,%d"), ti.dwID, pt.x, pt.y);
|
|
|
+ DuiLibDiag::Log(_T("TOUCHDOWN begin id=%u client=%d,%d"), ti.dwID, pt.x, pt.y);
|
|
|
// 这里【不再】用 `if (m_pEventClick != NULL) break;` 做通用守卫:Windows 会在 WM_TOUCH
|
|
|
// 前后补发合成的 WM_LBUTTONDOWN(同样设置 m_pEventClick),通用守卫会让 m_pEventTouch
|
|
|
// 永不设置 → 容器收不到 TOUCHMOVE,列表滚不动。
|
|
|
@@ -1782,7 +1783,7 @@ namespace DuiLib
|
|
|
}
|
|
|
else if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_MOVE)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("TOUCHMOVE begin id=%u client=%d,%d active=%s scrollContainer=%p"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHMOVE begin id=%u client=%d,%d active=%s scrollContainer=%p"),
|
|
|
ti.dwID, pt.x, pt.y,
|
|
|
m_pEventTouch != NULL ? m_pEventTouch->GetName().GetData() : _T("null"),
|
|
|
(void*)m_pTouchScrollContainer);
|
|
|
@@ -1798,7 +1799,7 @@ namespace DuiLib
|
|
|
}
|
|
|
else if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_UP)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("TOUCHUP begin id=%u client=%d,%d active=%s moved=%d"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP begin id=%u client=%d,%d active=%s moved=%d"),
|
|
|
ti.dwID, pt.x, pt.y,
|
|
|
m_pEventTouch != NULL ? m_pEventTouch->GetName().GetData() : _T("null"),
|
|
|
(int)m_bTouchMoved);
|
|
|
@@ -1828,7 +1829,7 @@ namespace DuiLib
|
|
|
// ------------------------------------------------------------------
|
|
|
TouchUp(pt, bTapLikeFinal);
|
|
|
|
|
|
- TouchTrace::Log(_T("TOUCHUP end synthesized=%d suppress=%d"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP end synthesized=%d suppress=%d"),
|
|
|
(int)bTapLikeFinal, (int)m_bSuppressPromotedTouchMouse);
|
|
|
}
|
|
|
}
|
|
|
@@ -1893,7 +1894,7 @@ namespace DuiLib
|
|
|
// ==================================================================
|
|
|
if (uMsg != DUI_WM_POINTERUP && IsModalBackdropWindow(m_hWndPaint))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("MODAL-BACKDROP swallow pointer msg=0x%04X hwnd=%p modal=%p"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-BACKDROP swallow pointer msg=0x%04X hwnd=%p modal=%p"),
|
|
|
uMsg, (void*)m_hWndPaint, (void*)CPaintManagerUI::GetModalWindow());
|
|
|
// 不 return true 之外的任何动作:不建状态、不派发。
|
|
|
// 同时顺手把可能残留的滑动标记收掉(上一次手势若被异常中断)。
|
|
|
@@ -1953,13 +1954,13 @@ namespace DuiLib
|
|
|
if (bYieldToTouchChannel
|
|
|
&& (uMsg == DUI_WM_POINTERDOWN || uMsg == DUI_WM_POINTERUPDATE))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("POINTER-MSG silent (yield to WM_TOUCH) msg=0x%04X w=0x%08X"), uMsg, (unsigned)wParam);
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG silent (yield to WM_TOUCH) msg=0x%04X w=0x%08X"), uMsg, (unsigned)wParam);
|
|
|
return true; // 吃掉,不驱动点击;也不 return false,免得被系统再转成鼠标消息
|
|
|
}
|
|
|
if (bYieldToTouchChannel && uMsg == DUI_WM_POINTERUP)
|
|
|
{
|
|
|
// 让路期间的 UP:放行到下面的 switch,由 DUI_WM_POINTERUP 分支只清状态、不派发点击。
|
|
|
- TouchTrace::Log(_T("POINTER-MSG UP passes through while yielding (state cleanup only) w=0x%08X"), (unsigned)wParam);
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG UP passes through while yielding (state cleanup only) w=0x%08X"), (unsigned)wParam);
|
|
|
}
|
|
|
// 下面各分支统一用这个名字(保持旧代码可读性)
|
|
|
const bool bPointerYieldedThisGesture = bYieldToTouchChannel;
|
|
|
@@ -1983,7 +1984,7 @@ namespace DuiLib
|
|
|
if (m_bPointerGestureActive && dwPointerId != m_dwActivePointerId
|
|
|
&& uMsg != DUI_WM_POINTERUP)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("POINTER-MSG foreign-pointer ignored msg=0x%04X id=%u active=%u"),
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG foreign-pointer ignored msg=0x%04X id=%u active=%u"),
|
|
|
uMsg, (unsigned)dwPointerId, (unsigned)m_dwActivePointerId);
|
|
|
return true;
|
|
|
}
|
|
|
@@ -1999,7 +2000,7 @@ namespace DuiLib
|
|
|
{
|
|
|
case DUI_WM_POINTERDOWN:
|
|
|
{
|
|
|
- TouchTrace::Log(_T("POINTER-MSG DOWN hwnd=%p pt=%d,%d id=%u"), (void*)m_hWndPaint, pt.x, pt.y, (unsigned)dwPointerId);
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG DOWN hwnd=%p pt=%d,%d id=%u"), (void*)m_hWndPaint, pt.x, pt.y, (unsigned)dwPointerId);
|
|
|
// 记下"本次手势由指针通道驱动":随后同一次触摸的 WM_TOUCH 会被 OnTouchInput 忽略。
|
|
|
m_bPointerGestureActive = true;
|
|
|
m_dwActivePointerId = dwPointerId;
|
|
|
@@ -2065,7 +2066,7 @@ namespace DuiLib
|
|
|
}
|
|
|
case DUI_WM_POINTERUP:
|
|
|
{
|
|
|
- TouchTrace::Log(_T("POINTER-MSG UP hwnd=%p pt=%d,%d id=%u yield=%d active=%d slide=%d"),
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG UP hwnd=%p pt=%d,%d id=%u yield=%d active=%d slide=%d"),
|
|
|
(void*)m_hWndPaint, pt.x, pt.y, (unsigned)dwPointerId,
|
|
|
(int)bPointerYieldedThisGesture, (int)m_bPointerGestureActive, (int)m_bTouchSlideActive);
|
|
|
// 手势结束:立刻解除"指针驱动中",让下一个手势可以重新选择通道。
|
|
|
@@ -2092,7 +2093,7 @@ namespace DuiLib
|
|
|
// ------------------------------------------------------------------
|
|
|
if (IsModalBackdropWindow(m_hWndPaint))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("MODAL-BACKDROP UP cleanup-only hwnd=%p modal=%p slide=%d"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-BACKDROP UP cleanup-only hwnd=%p modal=%p slide=%d"),
|
|
|
(void*)m_hWndPaint, (void*)CPaintManagerUI::GetModalWindow(), (int)m_bTouchSlideActive);
|
|
|
// 清滑动状态机(不发 TOUCHUP、不动控件树)。
|
|
|
m_bTouchSlideActive = false;
|
|
|
@@ -2113,7 +2114,7 @@ namespace DuiLib
|
|
|
{
|
|
|
// 让路中不应有活跃的滑动状态;万一有(两通道交叉),也要收掉,
|
|
|
// 否则 m_bTouchSlideActive 会残留到下一次手势,导致 Update 算错 Δ。
|
|
|
- TouchTrace::Log(_T("POINTER-MSG UP yielded-path (no click synthesized) pt=%d,%d slide=%d"),
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG UP yielded-path (no click synthesized) pt=%d,%d slide=%d"),
|
|
|
pt.x, pt.y, (int)m_bTouchSlideActive);
|
|
|
if (m_bTouchSlideActive) EndTouchSlideGesture(pt);
|
|
|
return false;
|
|
|
@@ -2143,7 +2144,7 @@ namespace DuiLib
|
|
|
{
|
|
|
// wParam 高位是滚轮增量(与 WM_MOUSEWHEEL 一致)
|
|
|
const short zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
|
|
|
- TouchTrace::Log(_T("POINTER-MSG WHEEL hwnd=%p delta=%d"), (void*)m_hWndPaint, (int)zDelta);
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG WHEEL hwnd=%p delta=%d"), (void*)m_hWndPaint, (int)zDelta);
|
|
|
LRESULT lRes = 0;
|
|
|
if (MessageHandler(WM_MOUSEWHEEL, MAKEWPARAM(0, zDelta), MAKELPARAM(pt.x, pt.y), lRes))
|
|
|
return true;
|
|
|
@@ -2158,7 +2159,7 @@ namespace DuiLib
|
|
|
// 捕获被系统夺走(典型:手势被中断、窗口失活)。
|
|
|
// nim_duilib 注释:若不设置 bHandled,系统会把它转成 WM_BUTTON 类消息 ——
|
|
|
// 我们这里明确吃掉并复位状态,避免状态残留导致后续点击全被吞。
|
|
|
- TouchTrace::Log(_T("POINTER-MSG CAPTURECHANGED hwnd=%p"), (void*)m_hWndPaint);
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG CAPTURECHANGED hwnd=%p"), (void*)m_hWndPaint);
|
|
|
m_bPointerGestureActive = false;
|
|
|
m_dwActivePointerId = 0;
|
|
|
m_dwPointerDownTick = 0;
|
|
|
@@ -2199,7 +2200,7 @@ namespace DuiLib
|
|
|
{
|
|
|
m_pfnDefProcRelay = pfnRelay;
|
|
|
m_hWndDefProcRelay = hWndTarget;
|
|
|
- TouchTrace::Log(_T("DEFPROC-RELAY set manager=%p hwnd=%p pfn=%p enabled=%d"),
|
|
|
+ DuiLibDiag::Log(_T("DEFPROC-RELAY set manager=%p hwnd=%p pfn=%p enabled=%d"),
|
|
|
(void*)this, (void*)hWndTarget, (void*)pfnRelay, (int)m_bRelayDefProcForTouchMove);
|
|
|
}
|
|
|
|
|
|
@@ -2210,7 +2211,7 @@ namespace DuiLib
|
|
|
{
|
|
|
if (m_pfnDefProcRelay != NULL)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("DEFPROC-RELAY clear manager=%p hwnd=%p pfn=%p relayed=%u"),
|
|
|
+ DuiLibDiag::Log(_T("DEFPROC-RELAY clear manager=%p hwnd=%p pfn=%p relayed=%u"),
|
|
|
(void*)this, (void*)m_hWndDefProcRelay, (void*)m_pfnDefProcRelay, m_uDefProcRelayCount);
|
|
|
}
|
|
|
m_pfnDefProcRelay = NULL;
|
|
|
@@ -2225,7 +2226,7 @@ namespace DuiLib
|
|
|
// 绑定窗口已变(如真模态换 HWND):钩子失效,别再调用悬垂的函数指针。
|
|
|
if (m_hWndDefProcRelay != NULL && m_hWndDefProcRelay != m_hWndPaint)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("DEFPROC-RELAY skipped: bound=%p cur=%p why=%s"),
|
|
|
+ DuiLibDiag::Log(_T("DEFPROC-RELAY skipped: bound=%p cur=%p why=%s"),
|
|
|
(void*)m_hWndDefProcRelay, (void*)m_hWndPaint, pszWhy != NULL ? pszWhy : _T("?"));
|
|
|
return;
|
|
|
}
|
|
|
@@ -2235,7 +2236,7 @@ namespace DuiLib
|
|
|
const bool bLog = (m_uDefProcRelayCount <= 5) || (m_uDefProcRelayCount % 20 == 0);
|
|
|
if (bLog)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("DEFPROC-RELAY call #%u msg=0x%04X hwnd=%p lParam=%d,%d why=%s"),
|
|
|
+ DuiLibDiag::Log(_T("DEFPROC-RELAY call #%u msg=0x%04X hwnd=%p lParam=%d,%d why=%s"),
|
|
|
m_uDefProcRelayCount, uMsg, (void*)m_hWndPaint,
|
|
|
(int)GET_X_LPARAM(lParam), (int)GET_Y_LPARAM(lParam),
|
|
|
pszWhy != NULL ? pszWhy : _T("?"));
|
|
|
@@ -2293,11 +2294,25 @@ namespace DuiLib
|
|
|
if (pControl == NULL) return;
|
|
|
}
|
|
|
if (pControl->GetManager() != this) return;
|
|
|
- if (pControl->GetInterface(DUI_CTR_BUTTON) == NULL) return;
|
|
|
- {
|
|
|
- CButtonUI* pButton = static_cast<CButtonUI*>(pControl->GetInterface(DUI_CTR_BUTTON));
|
|
|
- pButton->ClearPushedState();
|
|
|
- }
|
|
|
+
|
|
|
+ // --------------------------------------------------------------
|
|
|
+ // ◆【滑动起手误按压】优先走"控件自己实现的清接口"。
|
|
|
+ //
|
|
|
+ // 原先这里只有下面那条 `DUI_CTR_BUTTON` 专用路径 —— 它依赖
|
|
|
+ // `GetInterface(DUI_CTR_BUTTON)`,也就是说**只有 CButtonUI 系**能被清到。
|
|
|
+ // 而业务侧大量自绘控件(如本项目的 CDiandanFoodItemUI : CVerticalLayoutUI)
|
|
|
+ // 的按下态是"换整卡背景图"实现的,压根没有 m_uButtonState,
|
|
|
+ // 也就拿不到 DUI_CTR_BUTTON 接口 ⇒ 被那条早退路静默跳过
|
|
|
+ // ⇒ 触摸滑动起手时留下按压态背景(用户实测 bug)。
|
|
|
+ //
|
|
|
+ // 现在改为:先用基类虚函数 `CControlUI::ClearPushedState()`。
|
|
|
+ // · CButtonUI 已把它 override 成"清 PUSHED|CAPTURED|HOT",
|
|
|
+ // 所以按钮的行为与改前**完全一致**;
|
|
|
+ // · 业务自绘控件 override 成"复位自己的卡片样式";
|
|
|
+ // · 其余控件走基类默认空实现 = 安全 no-op。
|
|
|
+ // pControl 本身就是 CControlUI* 或其派生,基类指针即可完成虚分派。
|
|
|
+ // --------------------------------------------------------------
|
|
|
+ pControl->ClearPushedState();
|
|
|
}
|
|
|
|
|
|
bool CPaintManagerUI::TouchUp(const POINT& pt, bool bTapLike)
|
|
|
@@ -2336,7 +2351,7 @@ namespace DuiLib
|
|
|
// ==================================================================
|
|
|
if (IsModalBackdropWindow(m_hWndPaint))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("MODAL-BACKDROP TouchUp abort hwnd=%p modal=%p tap=%d pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-BACKDROP TouchUp abort hwnd=%p modal=%p tap=%d pt=%d,%d"),
|
|
|
(void*)m_hWndPaint, (void*)CPaintManagerUI::GetModalWindow(),
|
|
|
(int)bTapLike, pt.x, pt.y);
|
|
|
// 清掉本次手势的痕迹(不发任何通知、不给控件派发 TOUCHUP/BUTTON*)。
|
|
|
@@ -2401,7 +2416,7 @@ namespace DuiLib
|
|
|
// 所以自己把命中点的按下态收掉 —— 等价于鼠标路径里
|
|
|
// `WM_LBUTTONUP` 那句 `ClearPushedStateAt` + `bTouchDragged` 的
|
|
|
// "ptMouse 置 (-1,-1) 只清位不 Activate"效果。
|
|
|
- TouchTrace::Log(_T("TOUCHUP consumed as slide pt=%d,%d"), pt.x, pt.y);
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP consumed as slide pt=%d,%d"), pt.x, pt.y);
|
|
|
ClearPushedStateAt(NULL, pt);
|
|
|
m_pEventClick = NULL;
|
|
|
m_bSuppressPromotedTouchMouse = false;
|
|
|
@@ -2414,7 +2429,7 @@ namespace DuiLib
|
|
|
{
|
|
|
// 轻点,但没有候选点击目标(Begin 时 FindControl 落空)。
|
|
|
// 仍然要把按下视觉收干净(可能与其它路径交叉),然后吞掉。
|
|
|
- TouchTrace::Log(_T("TOUCHUP fallback-clear hwnd=%p pt=%d,%d"), (void*)m_hWndPaint, pt.x, pt.y);
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP fallback-clear hwnd=%p pt=%d,%d"), (void*)m_hWndPaint, pt.x, pt.y);
|
|
|
ClearPushedStateAt(NULL, pt);
|
|
|
m_bSuppressPromotedTouchMouse = false;
|
|
|
m_dwSuppressTick = 0;
|
|
|
@@ -2433,7 +2448,7 @@ namespace DuiLib
|
|
|
m_dwSuppressTick = 0;
|
|
|
m_bTouchMoved = false;
|
|
|
|
|
|
- TouchTrace::Log(_T("TOUCHUP dispatch click %s cls=%s pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP dispatch click %s cls=%s pt=%d,%d"),
|
|
|
pClick->GetName().GetData(), pClick->GetClass(), pt.x, pt.y);
|
|
|
|
|
|
// ==================================================================
|
|
|
@@ -2465,7 +2480,7 @@ namespace DuiLib
|
|
|
// ==================================================================
|
|
|
if (IsModalBackdropWindow(m_hWndPaint))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("TOUCHUP ABORT modal-opened-midway click=%s modal=%p pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP ABORT modal-opened-midway click=%s modal=%p pt=%d,%d"),
|
|
|
pClick->GetName().GetData(),
|
|
|
(void*)CPaintManagerUI::GetModalWindow(), pt.x, pt.y);
|
|
|
// 只收掉按下视觉,**绝不 SendNotify**。
|
|
|
@@ -2478,7 +2493,7 @@ namespace DuiLib
|
|
|
const bool bStillOwned = (pClick->GetManager() == this);
|
|
|
if (!bStillOwned)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("TOUCHUP ABORT foreign click=%s mgr=%p self=%p"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP ABORT foreign click=%s mgr=%p self=%p"),
|
|
|
pClick->GetName().GetData(), (void*)pClick->GetManager(), (void*)this);
|
|
|
return true;
|
|
|
}
|
|
|
@@ -2497,7 +2512,7 @@ namespace DuiLib
|
|
|
}
|
|
|
if (!bSameTarget)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("TOUCHUP ABORT covered-by-overlay click=%s hitNow=%s pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHUP ABORT covered-by-overlay click=%s hitNow=%s pt=%d,%d"),
|
|
|
pClick->GetName().GetData(),
|
|
|
pHitNow != NULL ? pHitNow->GetName().GetData() : _T("null"),
|
|
|
pt.x, pt.y);
|
|
|
@@ -2601,7 +2616,7 @@ namespace DuiLib
|
|
|
|
|
|
void CPaintManagerUI::ClearTouchHoverState(POINT pt)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("CLEAR-HOVER pt=%d,%d hover=%s leaveCount=%d"),
|
|
|
+ DuiLibDiag::Log(_T("CLEAR-HOVER pt=%d,%d hover=%s leaveCount=%d"),
|
|
|
pt.x, pt.y,
|
|
|
m_pEventHover != NULL ? m_pEventHover->GetName().GetData() : _T("null"),
|
|
|
m_aNeedMouseLeaveNeeded.GetSize());
|
|
|
@@ -3232,7 +3247,7 @@ namespace DuiLib
|
|
|
HWND hModal = s_hModalWindow;
|
|
|
const BOOL bModal = (pfnIsTouch != NULL && hModal != NULL && ::IsWindow(hModal))
|
|
|
? pfnIsTouch(hModal, &tfModal) : FALSE;
|
|
|
- TouchTrace::Log(_T("HEARTBEAT hb self=%p reg=%d tf=0x%X | modal=%p reg=%d tf=0x%X | ownerofModal=%p | fg=%p focus=%p active=%p | managerMsgs=%u | ptrActive=%d ptrId=%u ptrYield=%d"),
|
|
|
+ DuiLibDiag::Log(_T("HEARTBEAT hb self=%p reg=%d tf=0x%X | modal=%p reg=%d tf=0x%X | ownerofModal=%p | fg=%p focus=%p active=%p | managerMsgs=%u | ptrActive=%d ptrId=%u ptrYield=%d"),
|
|
|
(void*)m_hWndPaint, (int)bSelf, (unsigned)tfSelf,
|
|
|
(void*)hModal, (int)bModal, (unsigned)tfModal,
|
|
|
(hModal != NULL) ? (void*)::GetWindow(hModal, GW_OWNER) : NULL,
|
|
|
@@ -3461,7 +3476,7 @@ namespace DuiLib
|
|
|
// MOVE 最先到;若移动不开窗,紧随的 DOWN 就会漏(第二版实证)。
|
|
|
if (ConsumeCrossModalPromotedMouse(bClickLike, dwExtra))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("PROMOTED-GEN cross msg=0x%04X hwnd=%p gen=%u click=%d extra=0x%08X pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("PROMOTED-GEN cross msg=0x%04X hwnd=%p gen=%u click=%d extra=0x%08X pt=%d,%d"),
|
|
|
uMsg, (void*)m_hWndPaint, (unsigned)s_nPromotedMouseGeneration,
|
|
|
(int)bClickLike, (unsigned)(dwExtra & 0xFFFFFFFF),
|
|
|
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
|
|
|
@@ -3473,7 +3488,7 @@ namespace DuiLib
|
|
|
if (bClickLike)
|
|
|
{
|
|
|
// 残留序列的点击类消息 ⇒ 一律吞,绝不建立候选点击。
|
|
|
- TouchTrace::Log(_T("PROMOTED-GEN swallow msg=0x%04X hwnd=%p gen=%u extra=0x%08X pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("PROMOTED-GEN swallow msg=0x%04X hwnd=%p gen=%u extra=0x%08X pt=%d,%d"),
|
|
|
uMsg, (void*)m_hWndPaint, (unsigned)s_nPromotedMouseGeneration,
|
|
|
(unsigned)(dwExtra & 0xFFFFFFFF),
|
|
|
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
|
|
|
@@ -3508,7 +3523,7 @@ namespace DuiLib
|
|
|
{
|
|
|
// ★ extra 变了 ⇒ 换了一次手势 ⇒ 残留序列已经结束(哪怕它的 UP 丢了)。
|
|
|
// 这是第四版最重要的防御:不再依赖"必须等到 UP 才关窗"。
|
|
|
- TouchTrace::Log(_T("PROMOTED-GEN close-by-extra msg=0x%04X hwnd=%p gen=%u oldextra=0x%08X newextra=0x%08X"),
|
|
|
+ DuiLibDiag::Log(_T("PROMOTED-GEN close-by-extra msg=0x%04X hwnd=%p gen=%u oldextra=0x%08X newextra=0x%08X"),
|
|
|
uMsg, (void*)m_hWndPaint, (unsigned)s_nPromotedMouseGeneration,
|
|
|
(unsigned)(s_dwPromotedMouseTaintExtra & 0xFFFFFFFF),
|
|
|
(unsigned)(dwExtra & 0xFFFFFFFF));
|
|
|
@@ -3550,10 +3565,10 @@ namespace DuiLib
|
|
|
HWND hFg = ::GetForegroundWindow();
|
|
|
const BOOL bFg = (pfnIsTouch != NULL && hFg != NULL) ? pfnIsTouch(hFg, &tfFg) : FALSE;
|
|
|
|
|
|
- TouchTrace::Log(_T("MANAGER-MSG hwnd=%p manager=%p msg=0x%04X w=0x%p l=0x%p touch=%p suppress=%d"),
|
|
|
+ DuiLibDiag::Log(_T("MANAGER-MSG hwnd=%p manager=%p msg=0x%04X w=0x%p l=0x%p touch=%p suppress=%d"),
|
|
|
(void*)m_hWndPaint, (void*)this, uMsg, (void*)wParam, (void*)lParam,
|
|
|
(void*)m_pEventTouch, (int)m_bSuppressPromotedTouchMouse);
|
|
|
- TouchTrace::Log(_T("TOUCHREG self=%p reg=%d tf=0x%X | modal=%p reg=%d tf=0x%X | fg=%p reg=%d tf=0x%X | focus=%p active=%p"),
|
|
|
+ DuiLibDiag::Log(_T("TOUCHREG self=%p reg=%d tf=0x%X | modal=%p reg=%d tf=0x%X | fg=%p reg=%d tf=0x%X | focus=%p active=%p"),
|
|
|
(void*)m_hWndPaint, (int)bSelf, (unsigned)tfSelf,
|
|
|
(void*)hModal, (int)bModal, (unsigned)tfModal,
|
|
|
(void*)hFg, (int)bFg, (unsigned)tfFg,
|
|
|
@@ -3578,7 +3593,7 @@ namespace DuiLib
|
|
|
if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDBLCLK)
|
|
|
{
|
|
|
HWND hModalDbg = CPaintManagerUI::GetModalWindow();
|
|
|
- TouchTrace::Log(_T("CLICKTRACE msg=0x%04X target=%p promoted=%d modal=%p ownerOfModal=%p touch=%p supp=%d modalbit=%d pending=%d enable=%d extra=0x%p"),
|
|
|
+ DuiLibDiag::Log(_T("CLICKTRACE msg=0x%04X target=%p promoted=%d modal=%p ownerOfModal=%p touch=%p supp=%d modalbit=%d pending=%d enable=%d extra=0x%p"),
|
|
|
uMsg, (void*)m_hWndPaint, (int)IsPromotedTouchMouseMessage(),
|
|
|
(void*)hModalDbg,
|
|
|
(hModalDbg != NULL && ::IsWindow(hModalDbg)) ? (void*)::GetWindow(hModalDbg, GW_OWNER) : NULL,
|
|
|
@@ -3613,7 +3628,7 @@ namespace DuiLib
|
|
|
if ((uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDBLCLK)
|
|
|
&& IsModalBackdropWindow(m_hWndPaint))
|
|
|
{
|
|
|
- TouchTrace::Log(_T("MODAL-BACKDROP swallow mouse msg=0x%04X hwnd=%p promoted=%d modal=%p"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-BACKDROP swallow mouse msg=0x%04X hwnd=%p promoted=%d modal=%p"),
|
|
|
uMsg, (void*)m_hWndPaint, (int)IsPromotedTouchMouseMessage(),
|
|
|
(void*)CPaintManagerUI::GetModalWindow());
|
|
|
// 顺手作废可能残留的候选点击/捕获,避免抬手时被派发。
|
|
|
@@ -3650,7 +3665,7 @@ namespace DuiLib
|
|
|
m_dwSuppressTick = 0;
|
|
|
}
|
|
|
// [诊断] down/elapsed 只用于看时序,不再参与任何判定。
|
|
|
- TouchTrace::Log(_T("PROMOTED-MOUSE swallowed msg=0x%04X touch=%p suppress=%d down=%u elapsed=%u modal=%d"),
|
|
|
+ DuiLibDiag::Log(_T("PROMOTED-MOUSE swallowed msg=0x%04X touch=%p suppress=%d down=%u elapsed=%u modal=%d"),
|
|
|
uMsg, (void*)m_pEventTouch, (int)m_bSuppressPromotedTouchMouse,
|
|
|
(unsigned)m_dwTouchDownTick,
|
|
|
(m_dwSuppressTick != 0) ? (unsigned)(::GetTickCount() - m_dwSuppressTick) : 0u,
|
|
|
@@ -3711,7 +3726,7 @@ namespace DuiLib
|
|
|
// 抬起:销账。计数归零时 ReleasePromotedMousePending 会自动解除抑制。
|
|
|
ReleasePromotedMousePending();
|
|
|
}
|
|
|
- TouchTrace::Log(_T("MODAL-BEEP swallowed promoted msg=0x%04X hwnd=%p elapsed=%u pending=%d"),
|
|
|
+ DuiLibDiag::Log(_T("MODAL-BEEP swallowed promoted msg=0x%04X hwnd=%p elapsed=%u pending=%d"),
|
|
|
uMsg, (void*)m_hWndPaint, (unsigned)dwElapsed, m_nPromotedMousePending);
|
|
|
return true;
|
|
|
}
|
|
|
@@ -3775,7 +3790,7 @@ namespace DuiLib
|
|
|
// [诊断] 未进入归一化的指针消息(通道关闭、或 ENTER/ACTIVATE/HWHEEL 等),
|
|
|
// 只记录"系统确实在投指针消息"这一事实,不做任何处理
|
|
|
// (绝不能 return true —— 交回系统,保住它自己的指针状态机)。
|
|
|
- TouchTrace::Log(_T("POINTER-MSG observed-but-passed msg=0x%04X w=0x%08X enabled=%d hwnd=%p"),
|
|
|
+ DuiLibDiag::Log(_T("POINTER-MSG observed-but-passed msg=0x%04X w=0x%08X enabled=%d hwnd=%p"),
|
|
|
uMsg, (unsigned)wParam, (int)m_bPointerNormalizeEnabled, (void*)m_hWndPaint);
|
|
|
}
|
|
|
|
|
|
@@ -4350,7 +4365,7 @@ namespace DuiLib
|
|
|
return true;
|
|
|
case WM_MOUSELEAVE:
|
|
|
{
|
|
|
- TouchTrace::Log(_T("WM_MOUSELEAVE tracking=%d hover=%s leaveArr=%d click=%s"),
|
|
|
+ DuiLibDiag::Log(_T("WM_MOUSELEAVE tracking=%d hover=%s leaveArr=%d click=%s"),
|
|
|
(int)m_bMouseTracking,
|
|
|
m_pEventHover != NULL ? m_pEventHover->GetName().GetData() : _T("null"),
|
|
|
m_aNeedMouseLeaveNeeded.GetSize(),
|
|
|
@@ -4559,7 +4574,7 @@ namespace DuiLib
|
|
|
static_cast<CControlUI*>(aNeedMouseLeaveNeeded[i])->Event(event);
|
|
|
}
|
|
|
|
|
|
- TouchTrace::Log(_T("MOUSEMOVE-LEAVE old=%s leaveArr=%d new=%s pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("MOUSEMOVE-LEAVE old=%s leaveArr=%d new=%s pt=%d,%d"),
|
|
|
m_pEventHover->GetName().GetData(), m_aNeedMouseLeaveNeeded.GetSize(),
|
|
|
pNewHover != NULL ? pNewHover->GetName().GetData() : _T("null"), pt.x, pt.y);
|
|
|
m_pEventHover->Event(event);
|
|
|
@@ -4572,14 +4587,14 @@ namespace DuiLib
|
|
|
event.pSender = pNewHover;
|
|
|
pNewHover->Event(event);
|
|
|
m_pEventHover = pNewHover;
|
|
|
- TouchTrace::Log(_T("HOVER-ENTER %s cls=%s pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("HOVER-ENTER %s cls=%s pt=%d,%d"),
|
|
|
pNewHover->GetName().GetData(), pNewHover->GetClass(), pt.x, pt.y);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// [第十一轮诊断] 被闸门挡住时明确记录,否则"悬浮态为何没更新"无从判断。
|
|
|
- TouchTrace::Log(_T("HOVER-GATE-BLOCKED captured=%d promotedMove=%d curHover=%s pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("HOVER-GATE-BLOCKED captured=%d promotedMove=%d curHover=%s pt=%d,%d"),
|
|
|
(int)IsCaptured(), (int)bPromotedTouchMove,
|
|
|
m_pEventHover != NULL ? m_pEventHover->GetName().GetData() : _T("null"),
|
|
|
pt.x, pt.y);
|
|
|
@@ -4600,7 +4615,7 @@ namespace DuiLib
|
|
|
break;
|
|
|
case WM_LBUTTONDOWN:
|
|
|
{
|
|
|
- TouchTrace::Log(_T("WM_LBUTTONDOWN promoted=%d pt=%d,%d eventTouch=%s eventClick=%s"),
|
|
|
+ DuiLibDiag::Log(_T("WM_LBUTTONDOWN promoted=%d pt=%d,%d eventTouch=%s eventClick=%s"),
|
|
|
(int)IsPromotedTouchMouseMessage(), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),
|
|
|
m_pEventTouch != NULL ? m_pEventTouch->GetName().GetData() : _T("null"),
|
|
|
m_pEventClick != NULL ? m_pEventClick->GetName().GetData() : _T("null"));
|
|
|
@@ -4619,18 +4634,18 @@ namespace DuiLib
|
|
|
CControlUI* pControl = FindControl(pt);
|
|
|
if (pControl == NULL)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("LBUTTONDOWN no control hwnd=%p pt=%d,%d root=%p"),
|
|
|
+ DuiLibDiag::Log(_T("LBUTTONDOWN no control hwnd=%p pt=%d,%d root=%p"),
|
|
|
(void*)m_hWndPaint, pt.x, pt.y, (void*)m_pRoot);
|
|
|
break;
|
|
|
}
|
|
|
if (pControl->GetManager() != this)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("LBUTTONDOWN foreign control hwnd=%p pt=%d,%d name=%s manager=%p self=%p"),
|
|
|
+ DuiLibDiag::Log(_T("LBUTTONDOWN foreign control hwnd=%p pt=%d,%d name=%s manager=%p self=%p"),
|
|
|
(void*)m_hWndPaint, pt.x, pt.y, pControl->GetName().GetData(),
|
|
|
(void*)pControl->GetManager(), (void*)this);
|
|
|
break;
|
|
|
}
|
|
|
- TouchTrace::Log(_T("LBUTTONDOWN hit hwnd=%p name=%s class=%s pos=%d,%d,%d,%d enabled=%d visible=%d"),
|
|
|
+ DuiLibDiag::Log(_T("LBUTTONDOWN hit hwnd=%p name=%s class=%s pos=%d,%d,%d,%d enabled=%d visible=%d"),
|
|
|
(void*)m_hWndPaint, pControl->GetName().GetData(), pControl->GetClass(),
|
|
|
pControl->GetPos().left, pControl->GetPos().top, pControl->GetPos().right, pControl->GetPos().bottom,
|
|
|
(int)pControl->IsEnabled(), (int)pControl->IsVisible());
|
|
|
@@ -4689,7 +4704,7 @@ namespace DuiLib
|
|
|
break;
|
|
|
case WM_LBUTTONUP:
|
|
|
{
|
|
|
- TouchTrace::Log(_T("WM_LBUTTONUP promoted=%d pt=%d,%d eventTouch=%s eventClick=%s moved=%d"),
|
|
|
+ DuiLibDiag::Log(_T("WM_LBUTTONUP promoted=%d pt=%d,%d eventTouch=%s eventClick=%s moved=%d"),
|
|
|
(int)IsPromotedTouchMouseMessage(), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),
|
|
|
m_pEventTouch != NULL ? m_pEventTouch->GetName().GetData() : _T("null"),
|
|
|
m_pEventClick != NULL ? m_pEventClick->GetName().GetData() : _T("null"),
|
|
|
@@ -4757,7 +4772,7 @@ namespace DuiLib
|
|
|
ClearTouchHoverState(ptButtonUp);
|
|
|
}
|
|
|
|
|
|
- TouchTrace::Log(_T("LBUTTONUP moved=%d click=%s hover=%s leaveArr=%d capture=%d"),
|
|
|
+ DuiLibDiag::Log(_T("LBUTTONUP moved=%d click=%s hover=%s leaveArr=%d capture=%d"),
|
|
|
(int)m_bTouchMoved,
|
|
|
m_pEventClick != NULL ? m_pEventClick->GetName().GetData() : _T("null"),
|
|
|
m_pEventHover != NULL ? m_pEventHover->GetName().GetData() : _T("null"),
|
|
|
@@ -4770,7 +4785,7 @@ namespace DuiLib
|
|
|
m_bTouchMoved = false; // 用完即清,绝不影响后续真实鼠标点击
|
|
|
if (pClick == NULL)
|
|
|
{
|
|
|
- TouchTrace::Log(_T("LBUTTONUP no click hwnd=%p pt=%d,%d"),
|
|
|
+ DuiLibDiag::Log(_T("LBUTTONUP no click hwnd=%p pt=%d,%d"),
|
|
|
(void*)m_hWndPaint, pt.x, pt.y);
|
|
|
ReleaseCapture();
|
|
|
break;
|