コンストラクターでこれらのスタイルを設定するフォームがあります。
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
そして、私はイベントでいくつかの長方形を描きPaint
ます。フォームにコントロールはありません。ただし、フォームのサイズを変更すると、フォームの左右に黒い帯が表示されます。それらを取り除く方法はありますか?私はすべてを試し、リッスンしWM_ERASEBKGND
、WndProc
フォームを手動で描画し、WM_PAINT
カスタムダブルバッファを実装しました。他に試すことができるものはありますか?
私はこれを見つけました: https ://connect.microsoft.com/VisualStudio/feedback/details/522441/custom-resizing-of-system-windows-window-flickers そしてそれはDWMのバグのようですが、私は回避策ができることを願っています。
Paint
イベントでかなり強烈なグラフィックプレゼンテーションを描きたいので、ダブルバッファリングを使用する必要があることに注意してください。私はC#.NET 2.0、Win7で開発しています。
ステータスアップデート1
サイズ変更機能を自分で実装することで、ほとんどの黒い縞模様を取り除くことができました。しかし、まだいくつかの小さな不具合があります。一度resize
に操作して操作する方法はありますか?これが私がする必要があることpaint
の擬似コードです:
IntPtr hDC;
var size = new Size(250, 200);
IntPtr handle = API.PaintAndResizeBegin(this.Handle /* Form.Handle */,
size.Width, size.Height, out hDC);
using (var g = Graphics.FromHdc(hDC)) {
this.backBuffer.Render(g, size);
}
API.PaintAndResizeCommit(handle);
上記のコードを実装する方法はありますか?
2番目の解決策は、非クライアント領域を含むフォーム全体をバックバッファリングすることです。しかし、それを行う方法は?Vista / 7で素晴らしいエアロエフェクトを維持したいので、クライアント以外の領域を自分でペイントしたくありません。どんな助けでも深く感謝されます。
ステータスアップデート2
この問題は、すべてのアプリケーションでWindowsに遍在しているため、解決できないようです。MSがMacOSXにインスピレーションを与え、新しいWindowsで適切なAPIを提供することを期待できます。