Browse Source

临时保存一下

张洋 3 weeks ago
parent
commit
86d4333bcd

+ 21 - 28
DuiLib/Control/UIButton.cpp

@@ -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 )

+ 4 - 4
DuiLib/Core/UIManager.cpp

@@ -2502,10 +2502,10 @@ namespace DuiLib
 		{
 			static DWORD s_dwLastHeartbeat = 0;
 			const DWORD dwNowHb = ::GetTickCount();
-			// ⚠️ 这里当前是 **1000ms**(临时调密,便于真机核对滑动是否真的产生了
-			//   POINTER-MSG UPDATE / SLIDE-MOVE)。等"能滑动"确认稳定后改回 2000ms。
-			//   每 2 秒一条在快速滑动时样本太少,看不出 Δ 轨迹。
-			if ((LONG)(dwNowHb - s_dwLastHeartbeat) >= 1000)
+			// 2000ms:常规节奏。调试期曾临时调到 1000ms 以便核对滑动轨迹
+			// (每 2 秒一条在快速滑动时样本太少,看不出 Δ 轨迹);
+			// 触摸功能已验证正常(主窗口 / 模态弹框的点击与滑动均可用),故改回 2000ms。
+			if ((LONG)(dwNowHb - s_dwLastHeartbeat) >= 2000)
 			{
 				s_dwLastHeartbeat = dwNowHb;
 				// [手势让路] 打点前先取一份本 manager 的输入通道状态:

BIN
bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.dll


BIN
dll/debug/DuiLib_d.dll


BIN
lib/debug/DuiLib_d.lib