Browse Source

duilib触摸问题继续优化

张洋 4 weeks ago
parent
commit
99e9c8cb1a
2 changed files with 21 additions and 9 deletions
  1. 19 7
      DuiLib/Core/UIManager.cpp
  2. 2 2
      DuiLib/DuiLib.vcxproj

+ 19 - 7
DuiLib/Core/UIManager.cpp

@@ -22,6 +22,15 @@ namespace DuiLib
 	// 是因为 POS 收银场景下手指微颤/小幅拖动极易被判成点击,从而误把商品加进购物车。
 	static constexpr LONG TOUCH_TAP_SLOP = 10;
 
+	// WM_TOUCH 消息 ID 同样受 `#if _WIN32_WINNT >= 0x0601` 保护,DuiLib 工程未定义
+	// _WIN32_WINNT(StdAfx.h 兜底为 XP)→ 必须自行声明,否则 switch 里引用该消息 ID
+	// 会报 C2065(未声明的标识符)与 C2051(case 表达式不是常量)。实测固定值 0x0240。
+	// 注:Win7+ 段受保护的不仅有结构体与函数,**消息 ID 与辅助宏同样在内**,
+	//     TOUCH_COORD_TO_PIXEL 也在上面用 #ifndef 兜底,原因相同。
+#ifndef WM_TOUCH
+#define WM_TOUCH 0x0240
+#endif
+
 	static void GetChildWndRect(HWND hWnd, HWND hChildWnd, RECT& rcChildWnd)
 	{
 		::GetWindowRect(hChildWnd, &rcChildWnd);
@@ -496,10 +505,13 @@ namespace DuiLib
 			DWORD     cyContact;
 		} TOUCHINPUT, *PTOUCHINPUT;
 
-		// 与 winuser.h 完全一致的事件标志
-		const DWORD TOUCHEVENTF_MOVE = 0x0002;
-		const DWORD TOUCHEVENTF_DOWN = 0x0004;
-		const DWORD TOUCHEVENTF_UP   = 0x0008;
+		// 事件标志,数值与 winuser.h 的触摸事件标志一致。
+		// 名字必须避开 SDK 的同名宏:部分 SDK 把它们定义成【宏】,且不受 _WIN32_WINNT 版本段保护,
+		// 同名会被预处理器展开——声明变成 `const DWORD 0x0002 = 0x0002;`(C2059),
+		// 限定使用变成 `TouchApi::0x0004`(C2589)。故改用 TOUCHEVTFLAG 前缀。
+		const DWORD TOUCHEVTFLAG_MOVE = 0x0002;
+		const DWORD TOUCHEVTFLAG_DOWN = 0x0004;
+		const DWORD TOUCHEVTFLAG_UP   = 0x0008;
 
 		typedef BOOL (WINAPI *PFN_RegisterTouchWindow)(HWND, ULONG);
 		typedef BOOL (WINAPI *PFN_GetTouchInputInfo)(HANDLE, UINT, PTOUCHINPUT, int);
@@ -590,7 +602,7 @@ namespace DuiLib
 			pt.y = TOUCH_COORD_TO_PIXEL(ti.y);
 			::ScreenToClient(m_hWndPaint, &pt);
 
-			if (ti.dwFlags & TouchApi::TOUCHEVENTF_DOWN)
+			if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_DOWN)
 			{
 				m_bTouchDown = true;
 				m_ptLastTouchPos = pt;
@@ -615,7 +627,7 @@ namespace DuiLib
 					m_pTouchTarget->Event(event);
 				}
 			}
-			else if (ti.dwFlags & TouchApi::TOUCHEVENTF_MOVE)
+			else if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_MOVE)
 			{
 				if (!m_bTouchDown) continue;
 
@@ -650,7 +662,7 @@ namespace DuiLib
 					pTarget->Event(event);
 				}
 			}
-			else if (ti.dwFlags & TouchApi::TOUCHEVENTF_UP)
+			else if (ti.dwFlags & TouchApi::TOUCHEVTFLAG_UP)
 			{
 				if (!m_bTouchDown) continue;
 

+ 2 - 2
DuiLib/DuiLib.vcxproj

@@ -70,7 +70,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;UILIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;WINVER=0x0601;_WIN32_WINNT=0x0601;NTDDI_VERSION=0x06010000;UILIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <PrecompiledHeader>Use</PrecompiledHeader>
@@ -116,7 +116,7 @@ copy $(SolutionDir)temp\link\$(Platform)\$(Configuration)\$(ProjectName)\DuiLib.
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;UILIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;WINVER=0x0601;_WIN32_WINNT=0x0601;NTDDI_VERSION=0x06010000;UILIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>