Graphics.DrawImageは常にビットマップ全体をペイントするとは限りませんか?

StackOverflow https://stackoverflow.com/questions/1814289

質問

Graphics.DrawImage を使用すると、奇妙な問題に遭遇しました。

OnPaint e.Graphics.DrawImage(Image、Point)を使用してコントロールにビットマップ「バッファー」をペイントすると、画像の一部が省略されました。バッファは、それから構築された Graphics を使用して Bitmap に直接描画するヘルパーメソッドに格納されます。コントロールがペイントされると、キャッシュされたビットマップがコントロールに描画されます。

ビットマップをディスクに保存して調べたとき、ビットマップ自体はすべて揃っていたため、ビットマップ自体では何も省略されていないようです。 (以下の画像を参照)

これはビットマップバッファの外観です。
buffer
(ソース: 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

をご覧ください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top