停止在面板上绘制.NET以让非托管代码绘制
我在一个.NET Winforms GUI程序中使用非托管代码中的SDK。SDK在我通过句柄传递给SDK的面板上绘制图像。然而,它仍然是一个.NET控件,包含在完全管理的GUI元素中 我遇到的问题是,当重新绘制主窗口时,我的程序(和.NET运行时)会重新绘制这些面板,这是在非托管代码重新绘制面板上的图像之后发生的。这会用设计器中设置的“背景”覆盖我期望的图像 将面板交给SDK后,我想停止.NET重新绘制它们。但是,我需要保持调整大小的行为 我尝试了简单的方法,即从面板派生“MyPanel”,添加控制OnPaint()方法的自定义代码: 然而,这是行不通的 我还尝试在WndProc()中拦截WM_PAINT和WM_ERASEBKGND消息,这就是。。。更好,但不太好停止在面板上绘制.NET以让非托管代码绘制,.net,winforms,.net,Winforms,我在一个.NET Winforms GUI程序中使用非托管代码中的SDK。SDK在我通过句柄传递给SDK的面板上绘制图像。然而,它仍然是一个.NET控件,包含在完全管理的GUI元素中 我遇到的问题是,当重新绘制主窗口时,我的程序(和.NET运行时)会重新绘制这些面板,这是在非托管代码重新绘制面板上的图像之后发生的。这会用设计器中设置的“背景”覆盖我期望的图像 将面板交给SDK后,我想停止.NET重新绘制它们。但是,我需要保持调整大小的行为 我尝试了简单的方法,即从面板派生“MyPanel”,添加
我不知所措;这是必须的,否则大量的艰苦工作就会付诸东流,大量的艰苦工作开始从零开始实施一个不同的解决方案。作为我自己问题的答案,以下是根据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);
}
}
作为对我自己问题的回答,以下是根据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);
}
}
也可以覆盖OnPaintBackground。或者只在构造函数中使用SetStyle()关闭UserPaint样式,这样就永远不会调用这些方法。我最终使用了SetStyle,但作为属性的一部分,这样就可以在某些情况下打开/关闭.NET绘画。只要回答这个问题,你就有支票了,汉斯。请随时发布并详细说明你最终做了什么。您也可以将其标记为答案。还可以覆盖OnPaintBackground。或者只在构造函数中使用SetStyle()关闭UserPaint样式,这样就永远不会调用这些方法。我最终使用了SetStyle,但作为属性的一部分,这样就可以在某些情况下打开/关闭.NET绘画。只要回答这个问题,你就有支票了,汉斯。请随时发布并详细说明你最终做了什么。你也可以把它标记为答案。