簡體   English   中英

在c#winforms中使用繪制方法時如何防止閃爍?

[英]How to prevent flickering when using paint method in c# winforms?

碼:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawRectangle(Pens.White,
    e.ClipRectangle.Left,
    e.ClipRectangle.Top,
    e.ClipRectangle.Width - 1,
    e.ClipRectangle.Height - 1);
    base.OnPaint(e);
}

如何避免閃爍。 上面是panel1_PaintPaint事件的panel1_Paint方法。 謝謝。

默認情況下,某些Windows窗體控件未啟用雙緩沖。 我不確定該面板是否是其中之一,但是嘗試啟用它也不會有什么壞處。

不幸的是Control.DoubleBuffered是受保護的,因此除非您從控件繼承,否則必須依靠反射將其啟用。

Control ctrl;
ctrl.GetType()
    .GetProperty("DoubleBuffered", 
                 BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(control, true, null);

該問題很可能是由於未啟用雙重緩沖引起的。 雙緩沖是首先寫入內部(不可見)緩沖區直到完成所有繪制操作,然后將其緩沖到可見緩沖區的過程,這通過簡化實際緩沖區上的繪制操作來避免閃爍。

http://msdn.microsoft.com/zh-cn/library/3t7htc9c(v=vs.110).aspx列出了可能的解決方案。 將屬性DoubleBuffered設置為true似乎是最簡單的方法。 但是,由於它是受保護的,因此您要么需要使用反射來訪問它,要么從面板類繼承它,請在新類中將其設置為true並使用所述新類:

public class myPanel : Panel {
    public myPanel() : base() {
        this.DoubleBuffered = true;
    }
}

有幾種方法可以防止容器控件(例如面板控件)閃爍。 這些方法中的每一個都涉及 Panel基類(或其他合適的基類) 派生

第一種方法是啟用雙重緩沖,可以使用以下代碼行實現:

this.DoubleBuffered = true;

第二種有效方法是重寫CreateParams屬性並啟用WS_EX_COMPOSITED 使用以下代碼完成此操作:

private const int WS_EX_COMPOSITED = 0x02000000;

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= WS_EX_COMPOSITED;
        return cp;
    }
} 

為了訪問這些屬性中的任何一個,如我們所確定的, 我們需要從基類派生 因此,整個類聲明可能看起來像這樣:

public class GraphicsPanel : Panel
{
    private const int WS_EX_COMPOSITED = 0x02000000;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_COMPOSITED;
            return cp;
        }
    }

    public GraphicsPanel()
    {
        this.DoubleBuffered = true;
    }
}

在重建我們的解決方案后,一個新控件將添加到名為GraphicsPanel的工具箱中,我們可以對其進行可視化設計。 在運行時,您應該注意到閃爍現象明顯減少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM