2017-02-09 8 views
3

MDIフォームに複数のTableLayoutPanelsがあります。各テーブルレイアウトには複数のコントロール(ObjectListViewを含む)があり、一番上のものだけがvisibleに設定されています。フォームがフォーカスを取得したときに、背景とアーティファクトがObjectListViewに表示される

このSO answerのように解決策を実装しました。サイズ変更中にレイアウトの子コントロールにちらつきがないため、初めてフォームを開くときに効果的です。

私も追加:

protected override void OnShown(EventArgs e) 
    { 
     base.OnShown(e); 

     foreach (CoTableLayoutPanel tlp in this.Controls) 
     { 
      if (tlp != null) 
      { 
       tlp.BeginUpdate(); 
       tlp.Size = firstLayout.Size; 
       tlp.EndUpdate(); 
      } 
     } 
    } 

を、私は、フォーム内のレイアウトを切り替えたとき、彼らはすでに、すべての正しいサイズであり、私はさらにリサイズしながら、ちらつきを避けるように、私は上記ません。これも正常に動作します。

しかし、この派生テーブルレイアウトでコントロールをObjectListViewにしてフォーム間を切り替えると、コントロールが部分的に描画されます(特に境界線)、黒い背景が素早く表示され、最後の列が毎回サイズ変更されます列のFillsFreeSpaceプロパティ)。

標準TableLayoutPanelを使用すると、リストコントロールは期待通りに動作します。アーティファクトなし、黒い背景なし、列のサイズ変更なし。しかし、私はフォームを開くときに私はちらつきが戻ってきます。

ObjectListViewは、InvalidateRefreshのようなプロパティを持ち、フォームのOnGotFocusメソッドでこれらを呼び出そうとしました。問題は依然として続きます。

これはObjectListViewの問題ですか、派生テーブルレイアウト内から問題を解決できますか?

EDIT

問題は、この方法によって引き起こされる:

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

は、予想通り、この方法はObjectListView作業を行いますコメントアウトが、ちらつき戻ります。

上記の方法の回避策はありますか?

答えて

0

黒く表示されるのは、ウィンドウの一部であるの塗装されていないです。フォームに多数のコントロールがある場合、それらをすべて再ペイントすると、顕著なアーティファクトを生成するのに十分な時間がかかります。レイヤー付きウィンドウを使用すると黒色になり、不透明度またはTransparencyKeyプロパティーを使用すると黒色になります。そうしないと、塗装されていない部分が白くなる傾向があるため、アーティファクトはあまり好ましくない傾向があります。

ほとんどのプログラマは、それがちらつきの問題であると想定していますが、そうではないため、DoubleBufferedプロパティで解決できません。これを抑止するには、同じバッファを使用して、コントロールのダブルバッファリングすべてが必要です。おおよそWPFのアプローチ。

すべてダブルバッファリングは、WS_EX_COMPOSITEDスタイルフラグの機能です。純粋にオペレーティングシステムによって行われ、.NETは関与していません。これはAeroの初期バージョンで、XPで最初に利用可能です。 OSはトップレベルウィンドウ用のビットマップを作成し、コントロールにビデオフレームバッファに直接ではなくそのビットマップを描画するよう指示します。ペイントが終了すると、ビットマップを1つのブロックでフレームバッファに描画します。絵をもっと速くすることはできませんが、ユーザーはそれを非常に滑らかに感じます。DoubleBufferedプロパティを使用している場合は、これをオフにします。

私はWinforms btwのテクニックを発見しました。これは10年前に既にMSDNフォーラムのフォーラムポストで公開されています。それ以来、何度も何度もコピーされてきました。私はそれについて多くの否定的なフィードバックを得ていない、それはプログラマーの大多数の問題を解決する。私が知っている唯一のトラブルメーカーはTabControlです。特に、タブの数が多く、左右のナビゲーショングリフを表示しているときです。そのビジュアルスタイルレンダラーは今まで問題になっていませんでした。グリフが表示されたときに、それ自体が何度も再塗りつぶしを開始します。非常に急なちらつきのように見える、あなたはそれを見逃すことはできません。簡単に回避できます。

いいえ、私の解決策を先に進めてください。それは良いものであり、それを他の方法で行うことは非常に重要ではありません。親ウィンドウのサーフェス上に描画するウィンドウレスコントロールを使用して、WPFを完全に排除するためには、基本的にWPFを再作成する必要があります。 VB6はこのbtwを実行しました。なぜなら、VB6 UIはそのように見えます。コードでコントロールを置き換えることもできます(LabelとPictureBoxは特に無駄です)が、多くのコードを取る傾向があり、コードソリューションの3行を打つことはできません:)

+0

ありがとうございます。 –

関連する問題