张洋 4 weeks ago
parent
commit
95a04d256b

+ 3 - 5
DuiLib/Core/UIManager.cpp

@@ -1020,14 +1020,12 @@ namespace DuiLib
 		// 触摸手势的实际处理(滚动 / 轻触判定 / 惯性)由 CTouchWindowBase 通过 WM_TOUCH 完成,
 		// 轻触时它会以“纯净鼠标消息”(ExtraInfo=0) 重新发一次 down+up 给真正需要点击的控件。
 		//
-		// 作用范围用窗口属性“TouchMouseFilter”精确限定(CTouchWindowBase 在 WM_CREATE 里 SetProp 打标记):
-		// 只有调用过 RegisterTouchWindow 的窗口(主窗口及所有模态框,均继承自 CTouchWindowBase)才过滤。
-		// DuiLib 的下拉框/菜单等弹出窗口并未注册触摸、也没有此标记,GetProp 返回 NULL —— 它们的 FROMTOUCH
-		// 鼠标照常进入 DuiLib,触摸点选不受影响。
+		// 作用域天然正确:只有调用过 RegisterTouchWindow 的窗口(主窗口已在 OnCreate 注册)才会产生带
+		//   FROMTOUCH 标记的模拟鼠标;DuiLib 的下拉框/菜单等未注册触摸的弹出窗口不会产生该标记,照常进入
+		//   DuiLib,触摸点选不受影响。因此不必再用窗口属性做额外限定。
 		// 注:未用 IsTouchWindow,因其声明要求 _WIN32_WINNT>=0x0601,本项目部分目标 SDK 没有该符号。
 		if ((uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDBLCLK
 			|| uMsg == WM_MOUSEMOVE)
-			&& ::GetProp(m_hWndPaint, L"TouchMouseFilter") != NULL
 			&& (::GetMessageExtraInfo() & 0xFF515700) == 0xFF515700)
 		{
 			lRes = 0;

+ 13 - 7
zhipuzi_pos_windows/ui/CTouchWindowBase.cpp

@@ -76,16 +76,22 @@ void CTouchWindowBase::StopInertia()
 
 LRESULT CTouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
+	// [触屏注册·懒注册] 不能放在 WM_CREATE 分支里:各窗口 HandleMessage 在 WM_CREATE 处理完若 bHandled
+	// 仍为 TRUE 会直接 return,基类 WM_CREATE 永远走不到(主窗口是在自己的 OnCreate 里注册的,弹框此前从未注册)。
+	// 故改为“懒注册”:第一次进入基类 HandleMessage(任何未处理的消息,通常是创建后随即的 WM_SIZE /
+	// WM_SHOWWINDOW 等)即注册一次。这样主窗口与所有 CModalWnd 派生弹框都能统一获得 WM_TOUCH 能力,
+	// 再配合 CPaintManagerUI::MessageHandler 入口的 FROMTOUCH 过滤器,彻底消除“弹框里滑动误触 / 悬浮卡死”。
+	// 主窗口虽已在 OnCreate 注册过,重复注册无害;弹框此前缺失,这里统一补上。
+	if (!m_bTouchRegistered)
+	{
+		m_bTouchRegistered = true;
+		::RegisterTouchWindow(m_hWnd, 0);
+	}
+
 	switch (uMsg)
 	{
 		case WM_CREATE:
-			// 注册接收 WM_TOUCH。所有继承本类的窗口(主窗口、各种模态框)都会自动生效,
-			// 避免“主窗口能滑、弹框不能滑”的不一致。
-			::RegisterTouchWindow(m_hWnd, 0);
-			// 给本窗口打一个“触屏模拟鼠标需过滤”的标记,供 CPaintManagerUI::MessageHandler 入口过滤器识别。
-			// 用窗口属性而非 IsTouchWindow:后者声明要求 _WIN32_WINNT>=0x0601,本项目部分目标 SDK 无该符号。
-			// 窗口销毁时 Windows 会自动回收其属性,无需手动 RemoveProp。
-			::SetProp(m_hWnd, L"TouchMouseFilter", (HANDLE)1);
+			// 历史遗留:注册逻辑已上移到函数入口(见上方懒注册),此处不再处理。
 			break;
 
 		case WM_TOUCH:

+ 1 - 0
zhipuzi_pos_windows/ui/CTouchWindowBase.h

@@ -25,6 +25,7 @@ protected:
 	HWND m_hWndPaint = NULL;
 
 	// touch 状态
+	bool m_bTouchRegistered = false;    // 懒注册标记:RegisterTouchWindow 只需调一次
 	bool m_touchDown = false;
 	LONG m_lastX = 0;
 	LONG m_lastY = 0;