Пользовательский элемент управления для отображения изображения: переместить изображение внутрь

Я занимаюсь разработкой и приложением C# для Windows Mobile. У меня есть пользовательский элемент управления с переопределением 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 это изображение.

The rectImageToShow это инициализируется на событии OnResize следующим образом:

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

this.Top и this.Left - это угол topLeft для рисования изображения внутри пользовательского элемента управления.

Я думаю, что это будет работать нормально, но когда я перемещаю изображение, оно никогда не очищает весь контроль. Я всегда вижу часть предыдущего рисунка.

Что я делаю не так?

Спасибо!

1 ответ

Решение

Я думаю, что вы не очистили буфер изображения элемента управления. Вы только очистили задний буфер. Попробуйте это между 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);

Не уверен, что это правильно, но вы должны понять.

Другие вопросы по тегам