我遇到一个奇怪的问题时使用 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具有允许绘制的无效区域,并且其他所有内容都被剪切。如果要更新矩形控件,则应在Windows API中调用InvalidateRect以确保整个矩形是无效区域的一部分。只要控件的任何部分无效,就会自动调用OnPaint。

其他提示

你可以尝试一些不同的东西。

  • 后代码"UpdateBuffer"
  • 做一位图。保存(即缓冲区。省)之后updatebuffer电话和检查什么这位看起来像。
  • 确保所有控制已经制订第一,没有控制正在绘制的透明等。
  • 带的代码"onpaint"和"更新缓冲区",并把它放在一个单独的项目测试,看看是否它的工作。
  • 取出"基地。onpaint"和检查发生了什么
  • 尝试一个电话到位图。drawimageunscaled,而不是位图。drawimage
  • 尝试使用新点(0,0),而不是点。空(a下次拍摄但是你永远不知道...)

大量的选项进行调试这一点,只是一个问题,缩小下来。

查看 System.Windows.Forms.ControlStyles.ResizeRedraw

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top