| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- using System;
- using System.Windows.Forms;
- namespace Plugins.Vpp.Views
- {
- /// <summary>
- /// Cognex 显示控件渲染引擎统一修复:
- /// CogRecordDisplay 等显示控件默认用硬件加速渲染(CogRenderEngine),在向日葵远程 /
- /// 部分显卡驱动 / 远程会话环境下会整块白屏(本机已用最小程序实测复现:WinForms/WPF 均正常,
- /// 仅 Cog 显示白屏;切 GDI 渲染引擎后立即恢复)。
- /// 该属性只能在控件句柄创建之后读写(此前读写抛 InvalidOperationException),
- /// 这里统一在 HandleCreated 时机切换,并递归应用到容器里的所有 Cog 显示控件
- /// (覆盖 CogToolBlockEditV2 内部动态创建的工具编辑显示面板)。
- /// </summary>
- internal static class CogGdiRender
- {
- /// <summary>递归把 root 树内所有带 RenderEngine 属性的 Cog 显示控件切到 GDI 渲染。</summary>
- 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 { /* 单个控件切换失败不影响其它控件 */ }
- }
- }
- }
|