Graphics.DrawImage не всегда рисует все растровое изображение?
Вопрос
Я столкнулся со странной проблемой при использовании Graphics.DrawImage
.
Когда используешь e.Graphics.DrawImage(Image, Point)
в OnPaint
Чтобы нарисовать «буфер» растрового изображения на элементе управления, кажется, что части изображения опущены.Буфер заполняется с помощью вспомогательного метода, который обращается непосредственно к Bitmap
используя Graphics
построен из него.Когда элемент управления рисует, кэшированное растровое изображение рисуется на элементе управления.
Кажется, в самом растровом изображении ничего не упущено, потому что, когда я сохранил растровое изображение на диск и проверил его, оно все было там.(см. изображения ниже)
Вот как выглядит буфер растрового изображения:
(источник: zachjohnson.net)
Вот что появляется на панели управления:
(источник: zachjohnson.net)
Это все, что я делаю в OnPaint
:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.bufferInvalid)
{
this.UpdateBuffer();
}
if (this.buffer != null)
{
e.Graphics.DrawImage(this.buffer, Point.Empty);
}
}
Решение
Когда вызывается OnPaint, в Windows есть недопустимая область, в которую можно рисовать, а все остальное обрезается. Если вы хотите обновить прямоугольный элемент управления, вы должны вызвать InvalidateRect в Windows API, чтобы убедиться, что весь прямоугольник является частью недопустимой области. OnPaint будет вызываться автоматически всякий раз, когда какая-либо часть элемента управления недопустима.
Другие советы
Вы можете попробовать пару разных вещей.
- разместите код в «UpdateBuffer»
- сделайте растровое изображение.сохранение (т.е.buffer.save) после вызова updatebuffer и проверьте, как выглядит растровое изображение.
- убедитесь, что все элементы управления были нарисованы первыми и что никакие элементы управления не отображаются прозрачными и т. д.
- возьмите код «onpaint» и «буфера обновления» и поместите его в отдельный проект для тестирования, чтобы проверить, работает ли он.
- выньте "base.onpaint" и проверьте, что произойдет
- попробуйте вызвать bitmap.drawimageunscaled вместо bitmap.drawimage
- попробуйте использовать new point(0,0) вместо point.empty (долгий шанс, но кто знает...)
Множество вариантов отладки, просто нужно сузить круг.
Ознакомьтесь с System.Windows.Forms.ControlStyles.ResizeRedraw