Browse Source

修复模态对话框消息的bug

张洋 2 weeks ago
parent
commit
769fb6994b
3 changed files with 16 additions and 0 deletions
  1. 16 0
      DuiLib/Core/UIBase.cpp
  2. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.dll
  3. BIN
      dll/debug/DuiLib_d.dll

+ 16 - 0
DuiLib/Core/UIBase.cpp

@@ -924,6 +924,22 @@ LRESULT CALLBACK CWindowWnd::__DialogWndProc(HWND hWnd, UINT uMsg, WPARAM wParam
             BindRelayTarget(pfnTarget, hWnd);
             pMgr->SetDefProcRelay(&RelayWndProc, hWnd);
         }
+
+        // [真模态回归修复] 真模态(DialogBoxIndirectParam)期间,系统消息循环不调用主循环的
+        // TranslateMessage/PreMessageHandler,而本项目大量弹框把"工作线程 PostMessage 的完成消息"
+        // (如 WM_SHANGPIN_HANDLE_SUCCESS/FAIL、WM_MEMBER_CHECK_*、WM_SHOUKUAN_STATUS_*、
+        // WM_ZHENGCAN_RENSHU_* 等)挂在 IMessageFilterUI::MessageHandler 上、只经 pre-filter 链分发,
+        // 因此这些消息在模态下收不到,表现为点保存/确定后卡在"处理中…"。
+        // 这里在分发 WNDPROC 之前补跑本窗口的 pre-filter 链(pMgr->PreMessageHandler),
+        // 完全等价于主循环行为(pre-filter 优先,未处理再走 HandleMessage),彻底根除该回归。
+        // 取不到 manager 时降级为原行为,不引入新回归;WM_TOUCH 等 pre-filter 不处理的消息照常回落。
+        if (pMgr != NULL)
+        {
+            LRESULT lPre = 0;
+            if (pMgr->PreMessageHandler(uMsg, wParam, lParam, lPre))
+                return lPre;
+        }
+
         return pThis->HandleMessage(uMsg, wParam, lParam);
     }
 

BIN
bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.dll


BIN
dll/debug/DuiLib_d.dll