调整面板大小时图形的模糊缩放

时间:2010-11-11 11:24:00

标签: c# events

我有一个面板,我在其中进行一些自定义绘图。为了确保在调整面板大小时按比例缩放图形,我使用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);

造成这种情况的原因是什么?如何解决?

编辑:问题不是确定性的,但似乎取决于我调整窗口大小的速度(!)。如果我慢慢地,慢慢地调整窗口大小,我可以使它几乎任意大,而不会改变我的图形大小。

4 个答案:

答案 0 :(得分:3)

AFAIK,ClipRectangle不是您所需要的,请改用Bounds

绘制消息总是带有REPAINT所需的裁剪区域,并且它小于或等于整个控制区域,具体取决于遮挡了多少控件并且现在显示并需要重新绘制。

答案 1 :(得分:2)

当您调整窗口大小时,控件将仅使需要失效的区域无效。因此,如果你把它做得更大,它将假定已经存在的矩形是好的并且将使放大可见的新区域无效。由于您在调整大小时显然需要使整个控件无效,因此请添加resize事件处理程序并使控件无效。这应该可以解决你的问题。

答案 2 :(得分:1)

Form.DoubleBuffer属性设置为true。

答案 3 :(得分:1)

以下是其他人正确答案的综合:

  • 您应该覆盖/处理调整大小事件并使整个窗口无效
  • 在计算窗口的缩放比例时,您应该使用ClientRectangle而不是e.ClipRectangle。