2011-11-03 42 views
0

我想提请使用下面的代码在WinForm的某种图形:我试图绘制浮点值的东西在C#中,但我没有成功

private void button1_Click(object sender, EventArgs e) 
     { 
      Pen myPen = new System.Drawing.Pen(Color.Red); 
      Graphics handler = this.CreateGraphics(); 


      double[] nextPt = new double[2]; 
      double[] maurerPt = new double[2]; 
      for (int index = 1; index < 361; index++) 
      { 
       nextPt = calcRose(index * d); 

       //this line is incorrect but Drawline only accept Point which is int 
       //and valued are in fractions thats why I use double 
       handler.DrawLine(maurerPt[0], maurerPt[1], nextPt[0], nextPt[1]; 

       nextPt.CopyTo(maurerPt,2); 
      } 

      myPen.Dispose(); 
      handler.Dispose(); 

     } 

问题是我想创造某种数学图的东西叫做“maruer rose” 并且由于我的行数值是分数,所以我不能使用只接受int值的Point

我该如何使用double或float值来提供drawline?

关于。

+2

Graphics.DrawLine()有一个接受PointF的重载。只能绘制Paint事件btw。 –

回答

3

Hans应该发表他的评论作为回答,但他在两个帐户上都是正确的。 DrawLine()有一个超载,接受PointF,所以这不是问题。

你的下一个问题将弄清楚为什么你的图似乎随机消失。您应该在Control的Paint事件中执行所有,或者如果在派生类中,通过覆盖OnPaint(),总是绘制到提供的Graphics对象(e.Graphics)。

有时候,您的控件会重新绘制自己,也许是因为它被最小化了,它的尺寸被改变了,无论如何。您的代码仅在单击按钮时绘制,这意味着系统强制重新绘制会擦除图形。

接下来,您的代码有可能发生内存泄漏。如果在创建笔/图形对象和调用Dispose()之间发生什么事会发生什么?在这种特殊情况下,您的程序可能会崩溃,但总的来说,更重要的是,您不会拨打Dispose(),并且您暂时“泄漏”了一些本机资源。

你应该换的实现IDisposableusing报表类型的创作,即

using(var myPen = new System.Drawing.Pen(Color.Red)) 
using(var handler = this.CreateGraphics()) 
{ 
    // use 'myPen' and 'handler' here 
} 

这种结构实际上是一个try/finally块,所以即使花括号里面的东西抛出一个异常Dispose()仍然会叫做。

相关问题