using System; using System.Windows.Forms; namespace Plugins.Vpp.Views { /// /// Cognex 显示控件渲染引擎统一修复: /// CogRecordDisplay 等显示控件默认用硬件加速渲染(CogRenderEngine),在向日葵远程 / /// 部分显卡驱动 / 远程会话环境下会整块白屏(本机已用最小程序实测复现:WinForms/WPF 均正常, /// 仅 Cog 显示白屏;切 GDI 渲染引擎后立即恢复)。 /// 该属性只能在控件句柄创建之后读写(此前读写抛 InvalidOperationException), /// 这里统一在 HandleCreated 时机切换,并递归应用到容器里的所有 Cog 显示控件 /// (覆盖 CogToolBlockEditV2 内部动态创建的工具编辑显示面板)。 /// internal static class CogGdiRender { /// 递归把 root 树内所有带 RenderEngine 属性的 Cog 显示控件切到 GDI 渲染。 public static void Apply(Control root) { if (root == null) return; Hook(root); foreach (Control child in root.Controls) Apply(child); } private static void Hook(Control c) { if (c == null || !c.GetType().Name.StartsWith("Cog", StringComparison.OrdinalIgnoreCase)) return; var prop = c.GetType().GetProperty("RenderEngine"); if (prop == null || !prop.CanWrite) return; if (c.IsHandleCreated) SetEngine(c, prop); else { EventHandler onCreated = null; onCreated = (s, e) => { c.HandleCreated -= onCreated; SetEngine(c, prop); }; c.HandleCreated += onCreated; } } private static void SetEngine(Control c, System.Reflection.PropertyInfo prop) { try { var gdi = Enum.ToObject(prop.PropertyType, 1); // CogRenderEngineConstants.CogGDIRenderEngine = 1 prop.SetValue(c, gdi, null); } catch { /* 单个控件切换失败不影响其它控件 */ } } } }