2011-01-07 19 views
0

この原因は何ですか?他のコントロールは正常に表示されます。ダイアログを移動するときにmodaldialogのカスタムコントロールが再描画されない

public CustomControl() 
    { 
     SetStyle(ControlStyles.ResizeRedraw, true); 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     SetStyle(ControlStyles.UserPaint, true); 
    } 

カスタムコントロールは、TableLayoutPanelに配置されています。

...................

編集:明確にするため: は、あなたが一番上に小さなモーダルダイアログフォームとウィンドウサイズの制御を持っていると仮定します。ダイアログウィンドウを移動すると、ペイントのようにコントロールのウィンドウが表示されます(枠線はコントロールにペイントされます)。他のコントロールが同じフォーム、つまりmontcalendarやその他のカスタムコントロール上で行うように、コントロール自体は再描画されません。私はこれの原因を見つけることができないのでしょうか?

アーティファクトを描くの小さな詳細:

alt text

答えて

2

スニペットから伝えるのは難しいです。標準の間違いは、OnPaint()メソッドの代わりにControl.CreateGraphics()を使用して描画することです。動作しません、Windowsはコントロールの一部が明らかになったときにOnPaintメソッドを実行します。あなたが描いたものを拭くもの別の失敗モードは、ネイティブのWindowコントロールのラッパーであるコントロールから派生しています。これらのタイプのコントロールではUserPaintはサポートされていません。ネイティブのWindowsコードで描画する必要があります。


スクリーンショットから明らかなように、テキストがどのようにずれているかに注意してください。これは、OnPaint()オーバーライドがe.ClipRectangleプロパティを使用して描画する場所を特定するためです。その値は、コントロールを横切ってウィンドウをゆっくりとドラッグすると常に変更されますが、コントロールのどの部分を再描画する必要があるかがわかります。それはではありませんここではを描画します。これは制御境界に基づいていなければならず、通常は(0,0)から(ClientSize.Width、ClientSize.Height)までの矩形でなければなりません。

描画を最適化するためにe.ClipRectangleを使用することはこれまでにありません。クリッピング矩形の外側にあるときに高価な描画の詳細をスキップするのと同じように。そうでなければ小さなものですが、Windowsは既に自動的にクリッピングするのにはかなり良いです。

+0

私は、コントロールのOnPaintハンドラーで描画しています。私はコントロールやパネルからしか派生していません...問題のコントロールはペイント自体をしません、他のコントロールの複合コントロールの多くです。 frm.Show()はfrm.ShowDialog()と同じ結果を返します。 –

+1

スクリーンショットには、コード内のGraphics.ClipBoundsを使用して描画する場所を示す記号が表示されます。しないでください、それは間違っています。コントロール境界のみを使用します。 –

+0

あなたは正しいです!私はe.Cliprectangleを使ってペイントしていました...次の行で問題を修正しました:Rectangle boundsToPaint = new Rectangle(0,0、this.Bounds.Width、Bounds.Height); –

関連する問題