Graphics.DrawImage не всегда рисует все растровое изображение?

StackOverflow https://stackoverflow.com/questions/1814289

Вопрос

Я столкнулся со странной проблемой при использовании Graphics.DrawImage.

Когда используешь e.Graphics.DrawImage(Image, Point) в OnPaint Чтобы нарисовать «буфер» растрового изображения на элементе управления, кажется, что части изображения опущены.Буфер заполняется с помощью вспомогательного метода, который обращается непосредственно к Bitmap используя Graphics построен из него.Когда элемент управления рисует, кэшированное растровое изображение рисуется на элементе управления.

Кажется, в самом растровом изображении ничего не упущено, потому что, когда я сохранил растровое изображение на диск и проверил его, оно все было там.(см. изображения ниже)

Вот как выглядит буфер растрового изображения:
buffer
(источник: zachjohnson.net)

Вот что появляется на панели управления:
displayed value
(источник: 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top