1

フォームがあり、他のコントロール(ボタン、カスタムコントロール、ラベル、パネル、グリッドビュー)のトーンがあります。ちらつきの問題があったと思います。ダブルバッファリングを試しましたが、解決できませんでした。最後に私はこれを試しました:

protected override CreateParams CreateParams
{
    get
    {
        // Activate double buffering at the form level.  All child controls will be double buffered as well.
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;   // WS_EX_COMPOSITED
        return cp;
    }
} 

ちらつきはなくなりましたが、datagridviewの描画が間違っています。CellBorders、BorderColorsが間違っていることを示しています。実際、このコードには、背景画像や線などに問題があります。それはなぜですか、そしてどのように修正できますか?

4

2 に答える 2

3

私はこの質問が少し古いことを知っていますが、決して遅くなるよりはましです...

これは、ユーザーがフォームのサイズを変更したときにちらつきを停止するための回避策ですが、DataGridViewなどのコントロールの描画を台無しにすることはありません。フォーム名が「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:47:19.823 に答える
1

スムーズなサイズ変更とグリッド線の表示の秘訣は、アプリがWindowsXPまたはWindowsServer2003で実行されている場合にフラグを追加することでした。

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;

        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED  

        if (this.IsXpOr2003 == true)
            cp.ExStyle |= 0x00080000;  // Turn on WS_EX_LAYERED

        return cp;
    }
}

private Boolean IsXpOr2003
{
   get
   {
       OperatingSystem os = Environment.OSVersion;
       Version vs = os.Version;

       if (os.Platform == PlatformID.Win32NT)
           if ((vs.Major == 5) && (vs.Minor != 0))
               return true;
           else
               return false;
       else
           return false;
    }
}
于 2012-09-17T21:14:34.943 に答える