Graphics.clear Windowsフォームコントロールでは、コントロール自体をクリアします - これを防止する方法

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

質問

以下の方法を使用して、写真ボックスにカスタム選択矩形を描きようとします。

    void _drag_UpdateView(bool clearOnly, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("UpdateView");
        using (Graphics g = this.i_rendered.CreateGraphics())
        {
            g.Clear(Color.Transparent);
            if (clearOnly)
                return;
            int px = (_drag_start.X > e.Location.X)?e.Location.X:_drag_start.X;
            int py = (_drag_start.Y > e.Location.Y)?e.Location.Y:_drag_start.Y;
            if (px < 0)
                px = 0;
            if (py < 0)
                py = 0;
            int wx = Math.Abs(e.Location.X-_drag_start.X);
            int wy = Math.Abs(e.Location.Y-_drag_start.Y);
            g.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
        }
    }
.

私が呼んでいるときはいつでも:

g.Clear(Color.Transparent);
.

写真ボックス全体が黒に変わります。ただし、長方形はその上に描かれます。 もちろんそのメソッドを呼び出さない場合は、それ自体の長方形はそれ自体でスタックします。古い四角形を取り外して、このような新しいものを作成します。

誰かが何が悪いのかを説明できますか?

役に立ちましたか?

解決

OnPaintBackgroundまたはOnPaint以外の方法でコントロールをペイントしないでください。

実際には、パフォーマンス上の理由からそれを必要とするかもしれません(あなたが完全なコントロールを更新しないで、その場で何かを変更するだけでなく)、それはあなたのコードをはるかにトリッキーにするでしょう、そしてあなたはいつも同じことをする必要があるでしょうPaintイベント内のジョブも(出力が同じである必要があるため、他の多くの理由で呼び出される可能性があるため)。

Paintを使用する必要さえ、GraphicsコンテキストはCreateGraphicsオブジェクト内にあるため、コードを変更してください。

void DoPainting(object sender, PaintEventArgs e)
{
    // Do your calculations
    e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}
.

PaintEventArgsメソッドを使用するように指すように、一般的には一般的ではなく、通常はそれを呼び出す必要はありません(例えば、オートサイズのようなグラフィックに基づいていくつかの計算を実行する必要がある場合)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top