画一个矩形

4
出现某些原因导致矩形在运行程序时未显示,但是代码没有报错。我做错了什么?
(我使用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();

    }

}
3个回答

9

你只能在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);
    }
};

谢谢,但我似乎无法弄清楚在哪里放置您的代码。如果您也能向我展示完整的代码,那将更容易些。 - Lucas Jørgensen
@LucasJørgensen 只需用答案中的最后一段代码片段 (myform.Paint += ...) 替换您的 绘图代码 - Dmitry

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事件处理程序上添加绘图部分,否则它将不会保留在那里。当您尝试最小化或移动包含矩形的侧面,或者当表单需要由操作系统绘制时,绘制的矩形将消失。

0

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

您必须绘制矩形:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接