张洋 il y a 3 jours
Parent
commit
e52cb36a41

+ 14 - 7
zhipuzi_pos_windows/ui/TouchWindowBase.cpp

@@ -69,8 +69,8 @@ LRESULT TouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 	switch (uMsg)
 	switch (uMsg)
 	{
 	{
 		case WM_CREATE:
 		case WM_CREATE:
-			// 注册接收触摸(Win7+
-			::RegisterTouchWindow(m_hWnd, 0);
+			// 注册接收触摸(移除:由外部窗口统一注册,避免重复注册
+			// ::RegisterTouchWindow(m_hWnd, 0);
 			break;
 			break;
 
 
 		case WM_TOUCH:
 		case WM_TOUCH:
@@ -102,6 +102,9 @@ LRESULT TouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 						m_samples.clear();
 						m_samples.clear();
 						AddTouchSample(pt.y);
 						AddTouchSample(pt.y);
 
 
+						// 保存最后触摸点(用于惯性期间发送位置)
+						m_lastTouchPt = pt;
+
 						::PostMessage(target, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(pt.x, pt.y));
 						::PostMessage(target, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(pt.x, pt.y));
 						::SetCapture(target);
 						::SetCapture(target);
 					}
 					}
@@ -118,13 +121,16 @@ LRESULT TouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 							int wheelUnits = static_cast<int>(dy * PIXEL_TO_WHEEL);
 							int wheelUnits = static_cast<int>(dy * PIXEL_TO_WHEEL);
 							m_accumWheel += wheelUnits;
 							m_accumWheel += wheelUnits;
 
 
+							// 更新最后触摸点(用于惯性期间发送位置)
+							m_lastTouchPt = pt;
+
 							// 每当累积达到 WHEEL_DELTA 就发送一次 WM_MOUSEWHEEL
 							// 每当累积达到 WHEEL_DELTA 就发送一次 WM_MOUSEWHEEL
 							while (abs(m_accumWheel) >= WHEEL_DELTA)
 							while (abs(m_accumWheel) >= WHEEL_DELTA)
 							{
 							{
 								int sendDelta = (m_accumWheel > 0) ? WHEEL_DELTA : -WHEEL_DELTA;
 								int sendDelta = (m_accumWheel > 0) ? WHEEL_DELTA : -WHEEL_DELTA;
 								m_accumWheel -= sendDelta;
 								m_accumWheel -= sendDelta;
 
 
-								WPARAM wParamWheel = (WPARAM)(((unsigned short)0) | ((unsigned short)sendDelta << 16));
+								WPARAM wParamWheel = (WPARAM)(((DWORD)sendDelta) << 16);
 								LPARAM lParamPos = MAKELPARAM(pt.x, pt.y);
 								LPARAM lParamPos = MAKELPARAM(pt.x, pt.y);
 								::PostMessage(target, WM_MOUSEWHEEL, wParamWheel, lParamPos);
 								::PostMessage(target, WM_MOUSEWHEEL, wParamWheel, lParamPos);
 							}
 							}
@@ -153,6 +159,8 @@ LRESULT TouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 							}
 							}
 
 
 							m_touchDown = false;
 							m_touchDown = false;
+							// 保存最后触摸点(确保惯性期间有位置可用)
+							m_lastTouchPt = pt;
 							m_lastY = 0;
 							m_lastY = 0;
 							m_accumWheel = 0;
 							m_accumWheel = 0;
 							m_samples.clear();
 							m_samples.clear();
@@ -191,16 +199,15 @@ LRESULT TouchWindowBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 				int wheelUnits = static_cast<int>(pixels * PIXEL_TO_WHEEL);
 				int wheelUnits = static_cast<int>(pixels * PIXEL_TO_WHEEL);
 				m_accumWheel += wheelUnits;
 				m_accumWheel += wheelUnits;
 
 
-				POINT pt;
-				::GetCursorPos(&pt);
-				::ScreenToClient(target, &pt);
+				// 使用保存的最后触摸点(target 的客户区坐标)
+				POINT pt = m_lastTouchPt;
 				LPARAM lParamPos = MAKELPARAM(pt.x, pt.y);
 				LPARAM lParamPos = MAKELPARAM(pt.x, pt.y);
 
 
 				while (abs(m_accumWheel) >= WHEEL_DELTA)
 				while (abs(m_accumWheel) >= WHEEL_DELTA)
 				{
 				{
 					int sendDelta = (m_accumWheel > 0) ? WHEEL_DELTA : -WHEEL_DELTA;
 					int sendDelta = (m_accumWheel > 0) ? WHEEL_DELTA : -WHEEL_DELTA;
 					m_accumWheel -= sendDelta;
 					m_accumWheel -= sendDelta;
-					WPARAM wParamWheel = (WPARAM)(((unsigned short)0) | ((unsigned short)sendDelta << 16));
+					WPARAM wParamWheel = (WPARAM)(((DWORD)sendDelta) << 16);
 					::PostMessage(target, WM_MOUSEWHEEL, wParamWheel, lParamPos);
 					::PostMessage(target, WM_MOUSEWHEEL, wParamWheel, lParamPos);
 				}
 				}
 
 

+ 3 - 0
zhipuzi_pos_windows/ui/TouchWindowBase.h

@@ -26,6 +26,9 @@ protected:
 	LONG m_lastY = 0;
 	LONG m_lastY = 0;
 	int m_accumWheel = 0; // 累积 wheel 值(单位 wheel delta)
 	int m_accumWheel = 0; // 累积 wheel 值(单位 wheel delta)
 
 
+	// 保存最后一次触摸的点(目标 paint 窗口的客户区坐标),用于惯性期间发送位置
+	POINT m_lastTouchPt = { 0, 0 };
+
 	// 每像素转多少 wheel units(可调节灵敏度)
 	// 每像素转多少 wheel units(可调节灵敏度)
 	// wheelUnits = dy * PIXEL_TO_WHEEL,后面按 WHEEL_DELTA(120) 做累积阈值
 	// wheelUnits = dy * PIXEL_TO_WHEEL,后面按 WHEEL_DELTA(120) 做累积阈值
 	static constexpr float PIXEL_TO_WHEEL = 8.0f; // 约 15px -> 120,按需调整
 	static constexpr float PIXEL_TO_WHEEL = 8.0f; // 约 15px -> 120,按需调整

+ 7 - 3
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -187,11 +187,12 @@ LRESULT CMainWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandl
     ASSERT(pRoot && "Failed to parse XML");
     ASSERT(pRoot && "Failed to parse XML");
 
 
     m_pm.AttachDialog(pRoot);
     m_pm.AttachDialog(pRoot);
-    m_pm.AddNotifier(this);
 
 
-	//执行完初始化,再绑定事件,避免事件触发时,页面还没有完全
+	//执行完初始化,再绑定事件,避免事件触发时,页面还没有完全,特别是设置中心的初始化不能触发事件
 	Init();
 	Init();
 
 
+    m_pm.AddNotifier(this);
+
 	this->SetPaintWindow(m_pm.GetPaintWindow()); // 或类似方式获取 paint 窗口句柄
 	this->SetPaintWindow(m_pm.GetPaintWindow()); // 或类似方式获取 paint 窗口句柄
 
 
 	// 注册触摸支持(Windows 7+ 使用 WM_TOUCH)
 	// 注册触摸支持(Windows 7+ 使用 WM_TOUCH)
@@ -1263,7 +1264,10 @@ void CMainWnd::UpdateGongnengDaohang()
 		m_curOption = newOption;
 		m_curOption = newOption;
 
 
 		//触发事件切换page
 		//触发事件切换page
-		newOption->Selected(true, true);
+		newOption->Selected(true, false);
+
+		//因为初始化在绑定消息之后,这里不用触发消息,手动切换页面
+		this->SwitchPageByName(m_curOptionName);
 	}
 	}
 	else
 	else
 	{
 	{