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 { /* 单个控件切换失败不影响其它控件 */ }
}
}
}