嗨我正在尝试实现一个使用编码调整大小的表单。我已经使用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方法中完成所有事情吗?
答案 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
的来源不是很清楚。