Graphics.DrawImage Не всегда рисует весь растровое изображение? - PullRequest
0 голосов
/ 29 ноября 2009

Я столкнулся со странной проблемой при использовании 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);
    }
}

Ответы [ 3 ]

2 голосов
/ 29 ноября 2009

Когда вызывается OnPaint, в Windows есть недопустимая область, в которую можно рисовать, а все остальное обрезается. Если вы хотите обновить прямоугольный элемент управления, вы должны вызвать InvalidateRect в Windows API, чтобы убедиться, что весь прямоугольник является частью недопустимой области. OnPaint будет вызываться автоматически всякий раз, когда какая-либо часть элемента управления недопустима.

1 голос
/ 24 августа 2010

Проверьте System.Windows.Forms.ControlStyles.ResizeRedraw

1 голос
/ 29 ноября 2009

Вы можете попробовать несколько разных вещей.

  • отправить код в "UpdateBuffer"
  • сделать bitmap.save (т.е. buffer.save) после вызова updatebuffer и проверить, как выглядит растровое изображение.
  • убедитесь, что все элементы управления нарисованы первыми и что элементы управления не отображаются прозрачными и т. Д.
  • возьмите код "onpaint" и "буфер обновления" и поместите его в отдельное тестирование проекта, чтобы посмотреть, работает ли он.
  • достаньте "base.onpaint" и проверьте, что происходит
  • попробуйте вызвать bitmap.drawimageunscaled вместо bitmap.drawimage
  • попробуйте использовать новую точку (0,0) вместо point.empty (слишком длинный выстрел, но вы никогда не знаете ...)

Тонны вариантов отладки, просто сужение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...