// ============================================================ // 文档区停靠窗口:CAD 扒图工作区 // = 独立 cadbt.exe 主窗口的完整布局原样搬入: // 左 报价工具(CadQuoteWindow,内嵌 Form3 报价三表) // 中 CAD 查看器(CadViewerWindow,WebView2 网页 CAD) // 内部用 Smart DockSurface 承载(与独立版 MainForm 相同的停靠结构, // 内部布局可拖拽);F1/F2/F3 全局消息过滤器随窗口启停。 // ============================================================ using System; using System.Windows.Forms; namespace 成套报价软件 { /// CAD 扒图工作区(DockState.Document):报价三表 + 网页 CAD 查看器。 public class Cad扒图窗口 : WeifenLuo.WinFormsUI.Docking.DockContent { private readonly F1MessageFilter _f1Filter = new F1MessageFilter(); private CadQuoteWindow _quote; private CadViewerWindow _viewer; /// 内嵌的报价界面(主窗口功能区按钮跨窗口调用用;未创建为 null)。 public MyApp.Form3 报价表单 { get { return _quote != null ? _quote.报价表单 : null; } } public Cad扒图窗口() { Text = "CAD扒图"; TabText = "CAD扒图"; this.BackColor = System.Drawing.Color.White; // 与独立版 MainForm.CreateDockWindows_dockSurface1 相同的内部结构 var dockSurface = new Smart.CustomComponents.DockSurface(); dockSurface.Dock = DockStyle.Fill; Controls.Add(dockSurface); dockSurface.EnsureDefaultTheme(); // 必须:Show 前保证有效主题 _quote = new CadQuoteWindow(); _quote.CloseButtonVisible = false; _quote.TabText = "报价工具"; _quote.Text = "报价工具"; _quote.Show(dockSurface, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft); _viewer = new CadViewerWindow(); _viewer.CloseButtonVisible = false; _viewer.TabText = "CAD 查看器"; _viewer.Text = "CAD 查看器"; _viewer.Show(dockSurface, WeifenLuo.WinFormsUI.Docking.DockState.Document); // ★ 全局 F1/F2/F3 过滤器:焦点在任何 WinForms 控件上都触发元件合并 // (焦点在网页时由网页端转发,两路都汇聚到 CadBridge.F*Requested) Application.AddMessageFilter(_f1Filter); FormClosed += (s, e) => { Application.RemoveMessageFilter(_f1Filter); // 显式关内部窗口:Form3 解绑桥事件、CAD 查看器停 node 服务 try { if (_quote != null && !_quote.IsDisposed) _quote.Close(); } catch { } try { if (_viewer != null && !_viewer.IsDisposed) _viewer.Close(); } catch { } }; } /// 把 F1/F2/F3 按键(0x70/0x71/0x72)转成 CadBridge 事件,不拦截按键本身。 private class F1MessageFilter : IMessageFilter { public bool PreFilterMessage(ref Message m) { const int WM_KEYDOWN = 0x0100; if (m.Msg == WM_KEYDOWN && (int)m.WParam == 0x70) { try { CadBridge.RaiseF1(); } catch { } } else if (m.Msg == WM_KEYDOWN && (int)m.WParam == 0x71) { try { CadBridge.RaiseF2(); } catch { } } else if (m.Msg == WM_KEYDOWN && (int)m.WParam == 0x72) { try { CadBridge.RaiseF3(); } catch { } } return false; } } } }