繁体   English   中英

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

[英]Graphics.DrawImage Doesn't Always Paint The Whole Bitmap?

使用Graphics.DrawImage时遇到一个奇怪的问题。

OnPaint使用e.Graphics.DrawImage(Image, Point)在控件上绘制位图“缓冲区”时,图像的某些部分似乎被省略了。 缓冲区以帮助程序方法填充,该方法使用从其构造的Graphics直接绘制Bitmap 控件绘制时,将在控件上绘制缓存的位图。

在位图本身上似乎没有什么被遗漏,因为当我将位图保存到光盘并对其进行检查时,它就在那里了。 (参见下图)

这是位图缓冲区的样子:
缓冲
(来源: 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具有允许绘画的无效区域,其他所有内容均被裁剪。 如果要更新矩形控件,则应在Windows API中调用InvalidateRect,以确保整个矩形是无效区域的一部分。 只要控件的任何部分无效,就会自动调用OnPaint。

您可以尝试几种不同的方法。

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

调试的选项很多,仅需缩小范围即可。

签出System.Windows.Forms.ControlStyles.ResizeRedraw

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM