22

大量のコントロールを備えたアプリがあります。また、特に起動時に大量のちらつきがあります。

この修正を適用しました。

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

これはうまく機能しました - ちらつきはかなり信じられないほど減少しました. ただし、ウィンドウの右上にある [最小化]、[最大化]、および [閉じる] ボタンは、マウスを移動したりクリックしたりしてもアニメーションしません (それでも機能します)。これにより、アプリにハング感が生じます。

最大化、最小化、および閉じるボタンの使いやすさを維持しながら、WS_EX_COMPOSITED を保持するにはどうすればよいですか?

これは Windows XP で発生します。@fallenidol が指摘したように、これは Windows 7 の問題ではありません。

4

5 に答える 5

14

私はそれを考え出した。トリックは、フォームが表示された後に WS_EX_COMPOSITED フラグを削除することです。私のブログの完全な説明とコード:

Windows フォーム アプリケーションのちらつきをなくす方法

于 2010-07-21T23:39:48.153 に答える
8

私はこの質問が少し古いことを知っていますが、決して遅いよりはましです。リンクした元の例を使用して、サイズ変更時にオンに切り替えてから、オフに切り替えて他のすべてを完全に描画するものを考え出しました。この問題の解決策を探している他の人に役立つことを願っています。OPが知っているように、DoubleBufferingだけのプロパティではちらつきの問題は解決しません。

ユーザーがフォームのサイズを変更したときのちらつきを停止するための回避策を次に示しますが、DataGridView、NumericUpDown などのコントロールの描画を台無しにすることはありません。フォーム名が「Form1」の場合:

int intOriginalExStyle = -1;
bool bEnableAntiFlicker = true;

public Form1()
{
    ToggleAntiFlicker(false);
    InitializeComponent();
    this.ResizeBegin += new EventHandler(Form1_ResizeBegin);
    this.ResizeEnd += new EventHandler(Form1_ResizeEnd);
}

protected override CreateParams CreateParams
{
    get
    {
        if (intOriginalExStyle == -1)
        {
            intOriginalExStyle = base.CreateParams.ExStyle;
        }
        CreateParams cp = base.CreateParams;

        if (bEnableAntiFlicker)
        {
            cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED
        }
        else
        {
            cp.ExStyle = intOriginalExStyle;
        }

        return cp;
    }
} 

private void Form1_ResizeBegin(object sender, EventArgs e)
{
    ToggleAntiFlicker(true);
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    ToggleAntiFlicker(false);
}

private void ToggleAntiFlicker(bool Enable)
{
    bEnableAntiFlicker = Enable;
    //hacky, but works
    this.MaximizeBox = true;
}
于 2011-06-28T19:50:35.843 に答える
4

次のコードを試してください。これは、メイン フォームとその他のカスタム ユーザー コントロールに配置する必要があります。

        // Enable double duffering to stop flickering.
        this.SetStyle(ControlStyles.DoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);
        this.SetStyle(ControlStyles.Opaque, false);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.ResizeRedraw, true);
于 2010-07-20T14:00:03.613 に答える
0

DoubleBufferedと呼ばれる標準のWindowsフォームコントロールプロパティを試してみてください。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx

于 2010-07-20T07:14:18.557 に答える
0

この投稿に出くわしたばかりで、少し古いことに気づきました。しかし、私は自分のフォームで同じ問題を抱えており、(とにかく XP の場合) 洗練されていないソリューションが視覚スタイルを有効にしていないようです。

于 2012-12-09T18:23:43.530 に答える