Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止在面板上绘制.NET以让非托管代码绘制_.net_Winforms - Fatal编程技术网

停止在面板上绘制.NET以让非托管代码绘制

停止在面板上绘制.NET以让非托管代码绘制,.net,winforms,.net,Winforms,我在一个.NET Winforms GUI程序中使用非托管代码中的SDK。SDK在我通过句柄传递给SDK的面板上绘制图像。然而,它仍然是一个.NET控件,包含在完全管理的GUI元素中 我遇到的问题是,当重新绘制主窗口时,我的程序(和.NET运行时)会重新绘制这些面板,这是在非托管代码重新绘制面板上的图像之后发生的。这会用设计器中设置的“背景”覆盖我期望的图像 将面板交给SDK后,我想停止.NET重新绘制它们。但是,我需要保持调整大小的行为 我尝试了简单的方法,即从面板派生“MyPanel”,添加

我在一个.NET Winforms GUI程序中使用非托管代码中的SDK。SDK在我通过句柄传递给SDK的面板上绘制图像。然而,它仍然是一个.NET控件,包含在完全管理的GUI元素中

我遇到的问题是,当重新绘制主窗口时,我的程序(和.NET运行时)会重新绘制这些面板,这是在非托管代码重新绘制面板上的图像之后发生的。这会用设计器中设置的“背景”覆盖我期望的图像

将面板交给SDK后,我想停止.NET重新绘制它们。但是,我需要保持调整大小的行为

我尝试了简单的方法,即从面板派生“MyPanel”,添加控制OnPaint()方法的自定义代码:

然而,这是行不通的

我还尝试在WndProc()中拦截WM_PAINT和WM_ERASEBKGND消息,这就是。。。更好,但不太好


我不知所措;这是必须的,否则大量的艰苦工作就会付诸东流,大量的艰苦工作开始从零开始实施一个不同的解决方案。

作为我自己问题的答案,以下是根据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绘画。只要回答这个问题,你就有支票了,汉斯。请随时发布并详细说明你最终做了什么。你也可以把它标记为答案。