3

コンストラクターでこれらのスタイルを設定するフォームがあります。

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

そして、私はイベントでいくつかの長方形を描きPaintます。フォームにコントロールはありません。ただし、フォームのサイズを変更すると、フォームの左右に黒い帯が表示されます。それらを取り除く方法はありますか?私はすべてを試し、リッスンしWM_ERASEBKGNDWndProcフォームを手動で描画し、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を提供することを期待できます。

4

2 に答える 2

1

ウィンドウのペイントとサイズ変更を同時に行える機能を見つけました- UpdateLayeredWindow

これで、サイズ変更中にストリップがないサイズ変更可能なウィンドウを作成できるようになります。ただし、ウィンドウのコンテンツは自分でペイントする必要があるため、少し不便です。でも、とを使えば問題ないWPFと思います。UpdateLayeredWindow


アップデート

問題が見つかりました。:-)を使用するときUpdateLayeredWindowは、ウィンドウの境界線を自分でペイントする必要があります。したがって、UpdateLayeredWindowwin7で優れたガラス効果を使用して標準のウィンドウをペイントする場合は、問題が発生します。

Microsft Connectには、この問題に関するスレッドもあります。Microsoftは、これは設計上のバグであり、修正された場合は、おそらくWin8以降のシステムにあると述べています。したがって、これについてできることはあまりありません。

于 2010-06-21T17:36:00.223 に答える
0

フォームサーフェス上で直接カスタムレンダリングを行わないことが最善であることがわかりました。代わりに、ドッキングされたPictureBoxをフォームに配置し、PictureBoxに表示されるBitmapオブジェクトを作成し、System.Drawing.Graphics.FromImage(Image)メソッドを使用してその上にすべてを描画します。

私はその方法をゲームループで使用して、単純なシューティングゲーム(クリムゾンランドスタイル)を作成し、100 FPSを超えるかなり良いパフォーマンス(アンチエイリアスラインを使用)を取得しました。

于 2010-04-26T08:55:22.140 に答える