在GDI +中绘制网格具有更好的性能

时间:2012-08-20 00:44:33

标签: c# .net gdi+

我需要绘制一个带有Graphics类(只是交叉线)的网格,以及一个像这张图片的透明表示

enter image description here

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

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

    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));
        }
    }

2 个答案:

答案 0 :(得分:3)

有一种更好的方法:只需使用画笔

如果您需要创建用户定义的网格大小,可以使用

System.Drawing.TextureBrush 

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

中找到
System.Drawing.Drawing2D.HatchBrush 

已经是网格样式

答案 1 :(得分:0)

控件实际上是在绘制过程中闪烁(因为控件有意无意地失效)。这不是性能问题,但实际上因为控件不是DoubleBuffered

以下是在DoubleBuffered上启用Controls的代码:

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);
}