图形。DrawImage并不总是油漆整个位?
题
我遇到一个奇怪的问题时使用 Graphics.DrawImage
.
当使用 e.Graphics.DrawImage(Image, Point)
在 OnPaint
画一位'的缓冲器上的控制,它的出现,图像的部分被省略了。缓冲器中填充的辅助方法吸引直接上 Bitmap
使用 Graphics
建造它。当控制油漆、缓存的位图上绘制的控制。
没有出现省略上的位本身,因为当我救了位图以光盘和研究它,它都在那里。(见下图)
这是什么位缓冲看起来像:
(资料来源: 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电话和检查什么这位看起来像。
- 确保所有控制已经制订第一,没有控制正在绘制的透明等。
- 带的代码"onpaint"和"更新缓冲区",并把它放在一个单独的项目测试,看看是否它的工作。
- 取出"基地。onpaint"和检查发生了什么
- 尝试一个电话到位图。drawimageunscaled,而不是位图。drawimage
- 尝试使用新点(0,0),而不是点。空(a下次拍摄但是你永远不知道...)
大量的选项进行调试这一点,只是一个问题,缩小下来。
查看 System.Windows.Forms.ControlStyles.ResizeRedraw
不隶属于 StackOverflow