2017-10-11 76 views
-1

我想在C#Windows窗体中使用System.Drawing.Graphics绘制一个矩形,但我似乎无法让它在没有使用按钮单击事件的情况下工作。绘制与System.Drawing.Graphics窗体上加载

在线搜索发现我必须使用表单内的Paint或Shown事件,但是我的尝试失败了。

我想在加载表单及其组件时运行我的Draw()方法。

public Form1() 
{ 
    InitializeComponent(); 
    Draw(); //doesn't work 
} 

private void Draw() 
{ 
    Graphics g = pictureBox.CreateGraphics(); 
    g.Clear(Color.White); 
    Pen p = new Pen(Color.Black, 1); 
    g.DrawRectangle(p, 0, 0, 50, 50); 
} 

private void ApproximateButton_Click(object sender, EventArgs e) 
{ 
    Draw(); //works 
} 

实现此目的的正确方法是什么?

+0

不要忘了'.dispose()'你的''''''''''否则你会最终崩溃你的应用程序。 – Enigmativity

+0

@Ivan Spajic,考虑我的答案编辑。 – 4D1C70

回答

1

您可以实现此重写Form的OnLoad事件,也可以重新使用PaintEvent参数。

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    using (Graphics g = e.Graphics) 
    { 
     g.Clear(Color.White); 
     using (Pen p = new Pen(Color.Black, 1)) 
     { 
      g.DrawRectangle(p, 0, 0, 50, 50); 
     } 
    } 
} 

编辑:添加using语句配置资源

+2

您应该正确显示如何处置一次性用品。 – Enigmativity

+0

您可能会首先调用'base.OnPaint(e)'而不是最后一个,否则该表单可能会画出您刚刚绘制的任何内容。 –

+0

谢谢你的贡献,但不幸的是这并不适合我。我在我的一个非常类似的问题中找到了答案,所以我将这个问题标记为重复。你必须处理相应的对象仍然是正确的。 –

0

你也应该罚款把你的作用下,Form1的Load事件。

订阅Load事件后,试试这个;

public Form1() 
{ 
    InitializeComponent(); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Draw(); 
} 

private void Draw() 
{ 
    Graphics g = pictureBox.CreateGraphics(); 
    g.Clear(Color.White); 
    Pen p = new Pen(Color.Black, 1); 
    g.DrawRectangle(p, 0, 0, 50, 50); 
} 

Load事件在构造函数之后被调用。您的表单元素正在构造函数中创建,因此您在尝试在同一个函数中使用它们时遇到了一些问题。

+0

我试过了,它不适合我。我可以打印确认我正在按事件委托的正确方法,但是在调用我的Draw()方法时,没有任何反应。 –