【问题标题】:Draw grid in GDI+ with better performance在 GDI+ 中绘制网格具有更好的性能
【发布时间】:2012-08-15 09:32:05
【问题描述】:

我需要用Graphics 类(只是交叉线)和一个透明表示像这张图片一样绘制一个网格:

除了绘制每条线/矩形之外,我不知道任何其他方法。如果领域很宽,则性能很差。有没有更好的方法来绘制这些东西?

这是我当前绘制网格的代码:

    private void drawGrid(Graphics pGraphic, int pGridSize)
    {
        int verticalCount = this.mPicScreen.Width / pGridSize + 1;
        int horizontalCount = this.mPicScreen.Height / pGridSize + 1;

        Pen p = new Pen(Color.Gray);

        // Vertical Lines
        for (int i = 0; i < verticalCount; i++)
        {
            pGraphic.DrawLine(p,
                new Point(i * pGridSize, 0),
                new Point(i * pGridSize, this.mPicScreen.Height));
        }

        // Horizontal Lines
        for (int i = 0; i < horizontalCount; i++)
        {
            pGraphic.DrawLine(p,
                new Point(0, i * pGridSize),
                new Point(this.mPicScreen.Width, i * pGridSize));
        }
    }

【问题讨论】:

  • 能否提供已经写好的代码?
  • @Enigmativity 我刚刚添加了它。
  • 我试过你的代码,它似乎运行得非常快。我在 1,920 x 1,200 的屏幕上运行。
  • @Enigmativity 对不起,我忘记为控件打开DoubleBuffered,所以它闪烁太多,我认为是性能问题。谢谢你:)

标签: c# .net gdi+


【解决方案1】:

有一个更好的方法:用刷子

如果需要自定义网格大小,可以使用

System.Drawing.TextureBrush 

如果随机一个没问题,你可以在

中找到
System.Drawing.Drawing2D.HatchBrush 

已经是网格样式

【讨论】:

  • 在尝试使用纹理画笔使网格符合浮点大小时,是否有任何提示?
【解决方案2】:

控件在绘制过程中实际上是闪烁的(因为控件被故意失效)。不是性能问题,实际上是因为控件不是DoubleBuffered

这是在Controls 上启用DoubleBuffered 的代码:

public static void setDoubleBuffered(System.Windows.Forms.Control c)
{
    if (System.Windows.Forms.SystemInformation.TerminalServerSession)
        return;

    System.Reflection.PropertyInfo aProp =
          typeof(System.Windows.Forms.Control).GetProperty(
                "DoubleBuffered",
                System.Reflection.BindingFlags.NonPublic |
                System.Reflection.BindingFlags.Instance);

    aProp.SetValue(c, true, null);
}

【讨论】:

  • 你真的想通过反射设置隐藏属性吗?这就是使应用程序与下一个操作系统不兼容的黑客类型。 “DoubleBuffered”只是受保护 - 因此可以在派生类中设置它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2013-01-18
  • 2013-11-20
相关资源
最近更新 更多