Graphics.DrawImage并不总是绘制整个位图?

时间:2009-11-29 00:45:40

标签: .net winforms gdi+ drawing bitmap

使用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 个答案:

答案 0 :(得分:2)

当调用OnPaint时,Windows具有允许绘制的无效区域,并且其他所有内容都被剪切。如果要更新矩形控件,则应在Windows API中调用InvalidateRect以确保整个矩形是无效区域的一部分。只要控件的任何部分无效,就会自动调用OnPaint。

答案 1 :(得分:1)

你可以尝试几种不同的东西。

  • 将代码发布到“UpdateBuffer”
  • 在updatebuffer调用之后执行bitmap.save(即buffer.save)并检查位图的样子。
  • 确保首先绘制了所有控件,并且没有将控件绘制为透明等。
  • 获取“onpaint”和“update buffer”的代码,并将其放在一个单独的项目测试中,看它是否有效。
  • 取出“base.onpaint”并查看会发生什么
  • 尝试调用bitmap.drawimageunscaled而不是bitmap.drawimage
  • 尝试使用新点(0,0)而不是point.empty(一个loooong shot但是你永远不知道......)

调试这个的几个选项,只是缩小范围。

答案 2 :(得分:1)

查看System.Windows.Forms.ControlStyles.ResizeRedraw