我有一个面板,我在其中进行一些自定义绘图。为了确保在调整面板大小时按比例缩放图形,我使用Transform
的{{1}}属性。
Graphics
来自private void panelGraph_Paint(object sender, PaintEventArgs e)
{
var gfx = e.Graphics;
gfx.Transform = BuildTransform(e.ClipRectangle);
var width = 1.0f / gfx.Transform.Elements[0];
var white = new Pen(Color.White, width);
gfx.DrawLine(white, new PointF(-1.0f, -1.0f), new PointF(1.0f, -1.0f));
gfx.DrawLine(white, new PointF(-1.0f, -1.0f), new PointF(-1.0f, 1.0f));
}
的矩阵将宽度和高度[-2,2]的区域映射到BuildTransform
的区域。
代码有效。问题是当我调整面板大小时,我的图形缩放不顺畅,但是在不连续的步骤中发生。如果我在paint-function中添加以下行:
e.ClipRectangle
当我慢慢调整窗口大小时,我得到这样的输出:
Console.WriteLine("Paint {0} {1}", e.ClipRectangle.Width, e.ClipRectangle.Height);
造成这种情况的原因是什么?如何解决?
编辑:问题不是确定性的,但似乎取决于我调整窗口大小的速度(!)。如果我慢慢地,慢慢地调整窗口大小,我可以使它几乎任意大,而不会改变我的图形大小。
答案 0 :(得分:3)
AFAIK,ClipRectangle
不是您所需要的,请改用Bounds
。
绘制消息总是带有REPAINT所需的裁剪区域,并且它小于或等于整个控制区域,具体取决于遮挡了多少控件并且现在显示并需要重新绘制。
答案 1 :(得分:2)
当您调整窗口大小时,控件将仅使需要失效的区域无效。因此,如果你把它做得更大,它将假定已经存在的矩形是好的并且将使放大可见的新区域无效。由于您在调整大小时显然需要使整个控件无效,因此请添加resize事件处理程序并使控件无效。这应该可以解决你的问题。
答案 2 :(得分:1)
将Form.DoubleBuffer
属性设置为true。
答案 3 :(得分:1)
以下是其他人正确答案的综合: