|
|
@@ -177,34 +177,27 @@ namespace DuiLib
|
|
|
|
|
|
bool CButtonUI::Activate()
|
|
|
{
|
|
|
- // [临时诊断] 触摸点击不生效时,用这条日志定位到底卡在哪个守卫上。
|
|
|
- // 背景:触摸路径(BeginTouchSlideGesture → EndTouchSlideGesture → 调用方合成
|
|
|
- // BUTTONDOWN/BUTTONUP)与纯鼠标路径不同 —— DOWN 阶段只发 UIEVENT_TOUCHDOWN,
|
|
|
- // 按钮不会自己进 UISTATE_PUSHED|UISTATE_CAPTURED,所以 BUTTONUP 分支的
|
|
|
- // `if ((m_uButtonState & UISTATE_CAPTURED) != 0)` 可能直接不进、Activate 压根不被调用;
|
|
|
- // 而 CControlUI::Activate 里的捕获保护(!IsCaptured() && !CAPTURED)也会拦住。
|
|
|
- // 这两条都不会在任何现有日志里体现,所以单独打一条。
|
|
|
- // 定位完成后可整块删除(只影响日志,不影响逻辑)。
|
|
|
- if (m_pManager != NULL)
|
|
|
- {
|
|
|
- const bool bCapturedByMgr = m_pManager->IsCaptured();
|
|
|
- const bool bStateCaptured = ((m_uButtonState & UISTATE_CAPTURED) != 0);
|
|
|
- const bool bPushed = ((m_uButtonState & UISTATE_PUSHED) != 0);
|
|
|
- const bool bWouldPass = (bCapturedByMgr || bStateCaptured);
|
|
|
- TCHAR diag[MAX_PATH] = { 0 };
|
|
|
- ::GetModuleFileName(NULL, diag, MAX_PATH);
|
|
|
- TCHAR* pdiag = _tcsrchr(diag, _T('\\'));
|
|
|
- if (pdiag != NULL) *(pdiag + 1) = _T('\0');
|
|
|
- _tcscat_s(diag, MAX_PATH, _T("touch_trace.log"));
|
|
|
- FILE* fdiag = NULL;
|
|
|
- if (_tfopen_s(&fdiag, diag, _T("a, ccs=UTF-8")) == 0 && fdiag != NULL)
|
|
|
- {
|
|
|
- _ftprintf(fdiag, _T("BUTTON-ACTIVATE name=%s mgrCaptured=%d stateCaptured=%d pushed=%d guardPass=%d\n"),
|
|
|
- GetName().GetData(), (int)bCapturedByMgr, (int)bStateCaptured,
|
|
|
- (int)bPushed, (int)bWouldPass);
|
|
|
- fclose(fdiag);
|
|
|
- }
|
|
|
- }
|
|
|
+ // ------------------------------------------------------------------
|
|
|
+ // [已移除] 曾在这里挂过一段写 touch_trace.log 的 "BUTTON-ACTIVATE" 临时诊断。
|
|
|
+ //
|
|
|
+ // 它当初是为了定位"触摸点击不生效到底卡在哪个守卫上":触摸路径与纯鼠标路径
|
|
|
+ // 不同 —— DOWN 阶段只发 UIEVENT_TOUCHDOWN,按钮不会自己进
|
|
|
+ // UISTATE_PUSHED|UISTATE_CAPTURED,所以 BUTTONUP 分支的
|
|
|
+ // `if ((m_uButtonState & UISTATE_CAPTURED) != 0)`
|
|
|
+ // 可能直接不进、本函数压根不被调用;CControlUI::Activate 里的捕获保护
|
|
|
+ // (!IsCaptured() && !CAPTURED)也会拦住 —— 这两个失败点都不会在任何
|
|
|
+ // 现有日志里体现,所以单独打了一条。
|
|
|
+ //
|
|
|
+ // 结论(问题已解决,诊断不再需要):
|
|
|
+ // · 根因是 EndTouchSlideGesture 的释放捕获时序 —— 原先是"先 ReleaseCapture
|
|
|
+ // 再派发 TOUCHUP",导致两个捕获条件都已为假 ⇒ 本函数永不被调用;
|
|
|
+ // 现已改为"先 TOUCHUP、后 ReleaseCapture",见 EndTouchSlideGesture 里的说明。
|
|
|
+ // · 另一处根因是"无可滑动对象时仍按拖动吞掉点击",已在两条通道的 UP 分支
|
|
|
+ // 统一修正(日志前缀 no-scrollable-target)。
|
|
|
+ //
|
|
|
+ // ⚠️ 若将来又出现"按钮按下有高亮、抬手没反应",请优先复查上面这两处,
|
|
|
+ // 而不是重新加回日志 —— 那两条注释里写了完整的因果链。
|
|
|
+ // ------------------------------------------------------------------
|
|
|
|
|
|
if( !CControlUI::Activate() ) return false;
|
|
|
if( m_pManager != NULL )
|