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