在winforms中绘制绘制的图形

时间:2011-10-17 14:56:34

标签: c# winforms

嗨我正在尝试实现一个使用编码调整大小的表单。我已经使用form_paint方法绘制边框,但我不能"绘制"这个边界。我打算做的是,当我使用计时器调整表格以平滑调整大小"时,表格边框将随着调整大小一起更新。我该怎么办?

    Pen setupControlPen = new Pen(SystemColors.Control, 16);
    Pen setupDimGrayPen = new Pen(Color.DimGray, 5);

在我的form_paint://中绘制一个表单边框

    Rectangle newRectangle;
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
    setupGraphics.DrawRectangle(setupDimGrayPen, newRectangle);

在点击事件中://我试图在已绘制的边框上绘制。

    Rectangle newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
    setupGraphics.DrawRectangle(setupControlPen, newRectangle);
谢谢你!

更新:我尝试使用resize_form事件和计时器重绘,但每当我调整表单大小时仍然无法重新绘制边框。

更新2:覆盖方法有效!关于setupGraphics:

    //global space
    Graphics setupGraphics;

    //form_load
    setupGraphics = this.CreateGraphics();

    //so whenever I want to draw something during an event, supposing a button click event to draw a line:
    setupGraphics.DrawLine(pen, point1, point2);

我想问一下这种方法有什么缺陷吗?或者应该在form_paint方法中完成所有事情吗?

3 个答案:

答案 0 :(得分:4)

优化了容器控件的绘制。在您的情况下,这会妨碍您在表单大小更改时触发Paint事件。使你的构造函数看起来像这样:

    public Form1() {
        InitializeComponent();
        this.ResizeRedraw = true;
        this.DoubleBuffered = true;
    }

或者在OnPaintBackground()的覆盖中绘制边框。

答案 1 :(得分:2)

您的点击事件是否实际调整了表单的大小?如果没有对表单进行任何更改,那么表单将不会尝试重新绘制,您可以尝试其中一个...

form.Invalidate();
form.Refresh();
paintControl.Invalidate();
paintControl.Refresh();

paintControl适用于如果你有一个控件以外的控件实际上正在进行绘制,你应该只刷新所需的最小控件/区域

另外,不要忘记将表单/控件的DoubleBuffered设置为true

编辑:我不确定setupGraphics是什么?为什么不在Paint事件参数上使用e.Graphics对象?

答案 2 :(得分:2)

尝试重写OnPaintBackground方法并将表单的样式设置为ResizeRedraw并对其进行双重缓冲:

public Form1() {
  InitializeComponent();
  this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
}

protected override void OnPaintBackground(PaintEventArgs e) {
  e.Graphics.Clear(SystemColors.Control);

  using (Pen setupDimGrayPen = new Pen(Color.DimGray, 5)) {
    Rectangle newRectangle;
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
    e.Graphics.DrawRectangle(setupDimGrayPen, newRectangle);
  }
}

你的帖子中setupGraphics的来源不是很清楚。