C# 画一个长方形

C# 画一个长方形,c#,winforms,drawing,C#,Winforms,Drawing,由于某些原因,当我运行程序时,矩形没有显示。但是代码运行时没有任何错误。我做错了什么 (我正在使用csc.exe编译代码,我正在用记事本++编写它) 图纸代码: Graphics g = myform.CreateGraphics(); Pen selPen = new Pen(Color.Blue); g.DrawRectangle(selPen, 10, 10, 50, 50); g.Dispose(); 完整代码: using System; using System.Windows.F

由于某些原因,当我运行程序时,矩形没有显示。但是代码运行时没有任何错误。我做错了什么

(我正在使用csc.exe编译代码,我正在用记事本++编写它)

图纸代码:

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();

    }

}

您可以在
form.OnPaint
方法覆盖中或仅在
form.Paint
事件处理程序中绘制表单。
因此,您需要创建一个从
表单继承的新类

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);
    }
};

这是因为表单在显示时被绘制(在调用
ShowDialog
的情况下),这会删除所绘制的矩形

您必须绘制矩形:

  • 在表单显示之后。例如,在窗体的
    显示事件中,但请注意,当窗体再次绘制时,矩形将消失(例如,当您最小化/最大化窗体时)
  • 或者更好,在绘制表单时(在
    Paint
    事件中,请参见Dmitry的答案)

如果您重新排列代码,将图形代码放在显示零件之后,您可以看到矩形。由于在显示的窗体关闭之前,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事件处理程序中添加绘图零件,否则它不会保留在那里。当您尝试最小化或移动包含矩形的一侧时,或当操作系统需要绘制窗体时,绘制的矩形将消失。

谢谢,但我似乎不知道将代码放在何处。如果你也给我看完整的代码,那就容易多了。@LucasJørgensen只要用答案中的最后一个代码片段替换你的绘图代码(
myform.Paint+=…
)。@LucasJørgensen