Graphics.DrawImageは常にビットマップ全体をペイントするとは限りませんか?
質問
Graphics.DrawImage
を使用すると、奇妙な問題に遭遇しました。
OnPaint
で e.Graphics.DrawImage(Image、Point)
を使用してコントロールにビットマップ「バッファー」をペイントすると、画像の一部が省略されました。バッファは、それから構築された Graphics
を使用して Bitmap
に直接描画するヘルパーメソッドに格納されます。コントロールがペイントされると、キャッシュされたビットマップがコントロールに描画されます。
ビットマップをディスクに保存して調べたとき、ビットマップ自体はすべて揃っていたため、ビットマップ自体では何も省略されていないようです。 (以下の画像を参照)
これはビットマップバッファの外観です。
(ソース: zachjohnson.net )
コントロールに表示されるもの:
(ソース: zachjohnson.net )
これは私が OnPaint
で行っていることのすべてです:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.bufferInvalid)
{
this.UpdateBuffer();
}
if (this.buffer != null)
{
e.Graphics.DrawImage(this.buffer, Point.Empty);
}
}
解決
OnPaintが呼び出されると、Windowsにはペイントを許可する無効な領域があり、他のすべてはクリップされます。四角形のコントロールを更新する場合は、Windows APIでInvalidateRectを呼び出して、四角形全体が無効な領域の一部であることを確認する必要があります。 OnPaintは、コントロールの無効な部分があるたびに自動的に呼び出されます。
他のヒント
いくつかの異なることを試すことができます。
- " UpdateBuffer"にコードを投稿する
- updatebuffer呼び出しの後にbitmap.save(つまり、buffer.save)を実行し、ビットマップの外観を確認します。
- すべてのコントロールが最初に描画されていること、コントロールが透明に描画されていないことなどを確認します。
- 「onpaint」のコードを取得および「バッファの更新」動作するかどうかを確認するために別のプロジェクトテストに配置します。
- 「base.onpaint」を取り出します;そして何が起こるかを確認してください
- bitmap.drawimageの代わりにbitmap.drawimageunscaledの呼び出しを試みます
- point.emptyの代わりに新しいpoint(0,0)を使用してみてください(すごいショットですが、知りません...)
これをデバッグするためのオプションのトン、それを絞り込むだけの問題。
System.Windows.Forms.ControlStyles.ResizeRedraw