Browse Source

继续修复

张洋 4 weeks ago
parent
commit
57c29948aa
2 changed files with 10 additions and 4 deletions
  1. 6 4
      DuiLib/Core/UIManager.cpp
  2. 4 0
      zhipuzi_pos_windows/ui/CTouchWindowBase.cpp

+ 6 - 4
DuiLib/Core/UIManager.cpp

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

+ 4 - 0
zhipuzi_pos_windows/ui/CTouchWindowBase.cpp

@@ -82,6 +82,10 @@ LRESULT CTouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 			// 注册接收 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: