|
|
@@ -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:
|