由于某种原因,在运行程序时矩形不会显示。但代码运行没有任何错误。我做错了什么?
(我正在使用csc.exe编译代码,我用notepad ++编写它)
绘图代码:
Graphics g = myform.CreateGraphics();
Pen selPen = new Pen(Color.Blue);
g.DrawRectangle(selPen, 10, 10, 50, 50);
g.Dispose();
完整代码:
using System;
using System.Windows.Forms;
using System.Drawing;
public class Hello1
{
public static void Main()
{
Form myform = new Form();
myform.Text = "Main Window";
myform.Size = new Size(640, 400);
myform.FormBorderStyle = FormBorderStyle.FixedDialog;
myform.StartPosition = FormStartPosition.CenterScreen;
Graphics g = myform.CreateGraphics();
Pen selPen = new Pen(Color.Blue);
g.DrawRectangle(selPen, 10, 10, 50, 50);
g.Dispose();
myform.ShowDialog();
}
}
答案 0 :(得分:5)
您可以在Form.OnPaint
方法覆盖中或仅在Form.Paint
事件处理程序中绘制表单。
因此,您需要创建一个继承自Form
的新类:
public class MyForm : Form
{
}
将以下代码添加到表单中:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
using (Pen selPen = new Pen(Color.Blue))
{
g.DrawRectangle(selPen, 10, 10, 50, 50);
}
}
或者,您可以按如下方式订阅myform.Paint
事件:
myform.Paint += (o, e) => {
Graphics g = e.Graphics;
using (Pen selPen = new Pen(Color.Blue))
{
g.DrawRectangle(selPen, 10, 10, 50, 50);
}
};
答案 1 :(得分:0)
这是因为表单在显示时会被绘制(在您调用ShowDialog
的情况下),并且会删除您绘制的矩形。
您必须绘制矩形:
Shown
事件中 - 但要注意,当表单再次被绘制时,矩形将消失(例如,当您最小化/最大化表单时),Paint
事件中,请参阅Dmitry的回答)。答案 2 :(得分:0)
如果重新排列代码以将绘图代码放在显示部分之后,则可以看到矩形。由于在 ShowDialog()之后没有读取任何行,直到显示的表单关闭,您可能需要调用 Show()方法。
public static void Main()
{
Form myform = new Form();
myform.Text = "Main Window";
myform.Size = new Size(640, 400);
myform.FormBorderStyle = FormBorderStyle.FixedDialog;
myform.StartPosition = FormStartPosition.CenterScreen;
myform.Show(); // -> First Show
// -> Then Draw
Graphics g = myform.CreateGraphics();
Pen selPen = new Pen(Color.Blue);
g.DrawRectangle(selPen, 10, 10, 50, 50);
g.Dispose();
}
通过这样做,您可以看到矩形。但除非您在 OnPaint 事件处理程序上添加绘图部分,否则它不会保留在那里。当您尝试最小化或移动包含矩形的边时,或者当操作系统需要绘制窗体时,绘制的矩形将消失。