Пользовательский элемент управления для отображения изображения: переместить изображение внутрь - PullRequest
0 голосов
/ 01 марта 2009

Я разрабатываю и 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 это изображение.

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

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

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

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

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

Спасибо!

1 Ответ

2 голосов
/ 01 марта 2009

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

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

...