在Panel上停止.NET绘制以允许非托管代码绘制

时间:2011-11-12 00:08:22

标签: .net winforms

我在非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消息,这是......更好,但不是很好。

我很茫然;这只是必须工作或者许多艰苦的工作耗尽,而且很多艰苦的工作开始从头开始实施不同的解决方案。

1 个答案:

答案 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);
    }
}