我在非Winaged代码中有一个SDK,我在.NET Winforms GUI程序中使用它。 SDK在面板上绘制图像,我通过句柄传递给SDK。但是,它仍然是一个.NET控件,包含在完全托管的GUI元素中。
我遇到的问题是,当重新绘制主窗口时,我的程序(以及.NET运行时)会重新绘制这些面板,这是在非托管代码重绘面板上的图像后发生的。用Designer中设置的“背景”覆盖我期望的图像。
在将面板提供给我的SDK后,我想停止.NET重新绘制它们。但是,我需要保持调整大小的行为。
我尝试了一种简单的方法,即从Panel派生“MyPanel”,添加控制OnPaint()方法的自定义代码:
public class MyPanel : Panel
{
[Category("Behavior"), DefaultValue(true)]
public bool LetNetPaint { get; set; }
protected override void OnPaint(PaintEventArgs e)
{
if(LetNetPaint)
base.OnPaint(e);
}
}
然而,这不起作用。
我还尝试拦截WndProc()中的WM_PAINT和WM_ERASEBKGND消息,这是......更好,但不是很好。
我很茫然;这只是必须工作或者许多艰苦的工作耗尽,而且很多艰苦的工作开始从头开始实施不同的解决方案。
答案 0 :(得分:1)
作为我自己的问题的答案,根据Hans Passant的SetStyle建议,这里的代码最终正在运行:
public class NativeDrawingPanel : Panel
{
private bool letNetPaint;
[Category("Behavior"), DefaultValue(true)]
public bool LetNetPaint
{
get { return letNetPaint; }
set
{
letNetPaint = value;
SetStyle(ControlStyles.UserPaint, value);
if(value) Refresh();
}
}
public NativeDrawingPanel()
{
letNetPaint = true;
SetStyle(ControlStyles.UserPaint, true);
}
}