【问题标题】:I'm trying to draw something with float value in c# but I'm not successful我正在尝试在 c# 中绘制具有浮点值的东西,但我没有成功
【发布时间】:2011-11-03 23:04:19
【问题描述】:

我想使用以下代码在 winform 上绘制某种图形:

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”的数学图 并且由于我的行值是分数,所以我不能使用 Point 它只接受 int 值

如何使用双精度或浮点值输入画线?

问候。

【问题讨论】:

  • Graphics.DrawLine() 有一个接受 PointF 的重载。顺便说一句,只在 Paint 事件中绘制。

标签: c# graphics


【解决方案1】:

汉斯应该发表他的评论作为答案,但他在这两个方面都是正确的。 DrawLine() 有一个接受 PointF 的重载,所以这不是问题。

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

有时您的控件会重新绘制自己,可能是因为它被最小化了,它的尺寸被改变了,等等。您的代码仅在单击按钮时绘制,这意味着系统强制重新绘制将清除您的图形。

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

您应该将实现 IDisposable 的类型的创建封装在 using 语句中,即

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

这个结构实际上是一个 try/finally 块,所以即使 curlies 中的某些东西抛出异常 Dispose() 仍然会被调用。

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多