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