0

Windows Mobile用のC#アプリを開発しています。ユーザーがポインターで移動する画像を描画するために、 OnPaint をオーバーライドしたカスタム コントロールがあります。私自身の OnPaint メソッドは次のとおりです。


protected override void OnPaint(PaintEventArgs e)
{
    Graphics gxOff; //Offscreen graphics
    Brush backBrush;

    if (m_bmpOffscreen == null) //Bitmap for doublebuffering
    {
        m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
    }

    gxOff = Graphics.FromImage(m_bmpOffscreen);

    gxOff.Clear(Color.White);

    backBrush = new SolidBrush(Color.White);
    gxOff.FillRectangle(backBrush, this.ClientRectangle);

    //Draw some bitmap
    gxOff.DrawImage(imageToShow, 0, 0, rectImageToShow, GraphicsUnit.Pixel);

    //Draw from the memory bitmap
    e.Graphics.DrawImage(m_bmpOffscreen,  this.Left, this.Top);

    base.OnPaint(e);
}

imageToShow画像です。

rectImageToShowは、イベント OnResize で次のように初期化されます

rectImageToShow = 
   new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);

this.Topthis.Leftは、カスタム コントロール内に画像を描画するための topLeft コーナーです。

うまくいくと思いますが、画像を移動すると、すべてのコントロールがきれいになることはありません。私はいつも前の絵の一部を見ています。

私が間違っていることは何ですか?

ありがとうございました!

4

1 に答える 1

2

コントロールの画像バッファをクリアしていないと思います。バック バッファをクリアしただけです。2 つの DrawImage 呼び出しの間でこれを試してください。

e.Graphics.Clear(Color.White);

これにより、最初に残りの画像がクリアされます。


または、すべてがバック バッファーに描画され、バック バッファーが正確に (0, 0) で画面に描画されるように書き直すことができます。これにより、問題はバック バッファー描画ロジックが原因で発生し、その間のどこかではなくなります。

このようなもの:

Graphics gxOff; //Offscreen graphics
Brush backBrush;

if (m_bmpOffscreen == null) //Bitmap for doublebuffering
{
    m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
}

// draw back buffer
gxOff = Graphics.FromImage(m_bmpOffscreen);

gxOff.Clear(Color.White);

backBrush = new SolidBrush(Color.White);

gxOff.FillRectangle(backBrush, this.Left, this.Top,
    this.ClientRectangle.Width,
    this.ClientRectangle.Height);

//Draw some bitmap
gxOff.DrawImage(imageToShow, this.Left, this.Top, rectImageToShow, GraphicsUnit.Pixel);

//Draw from the memory bitmap
e.Graphics.DrawImage(m_bmpOffscreen,  0, 0);

base.OnPaint(e);

それが正しいかどうかはわかりませんが、アイデアを得る必要があります。

于 2009-03-01T08:59:00.670 に答える