C#绘图 - 最佳解决方案

时间:2012-07-09 20:59:56

标签: c# .net drawing panel

今天我正试图用闪烁的面板解决问题,当我画上它时。

我读过很多线程,比如:

所以我尝试使用doubleBuffered绘制PictureBox,MyPanel,但是当我读到时,我找到的最佳解决方案是每次都不能使用g.Clear(),之后,甚至在非doubleBuffered面板上,眨眼消失了。

我甚至读过,画完后我应该释放图形。所以我在任何地方使用(Graphics g = panel.CreateGraphics())。

所以我的问题,只有在我绘制内容时才为位图创建图形是个好主意吗?因为在我创建Bitmap和Graphics之前(仅针对此位图,而不是针对所有组件),所以每次都有可用于此位图的图形

这是我的代码:

public void newSizeDrawing()
    {
        Size size = collector.getLetterSize(selectedName);
        Size drawingSize = new Size(size.Width * (pixelSizeArray[pixelSize] + 1),size.Height * (pixelSizeArray[pixelSize] + 1));
        bitmapDraw = new Bitmap(drawingSize.Width, drawingSize.Height);
        int width = (this.MinimumSize.Width - panelDraw.MinimumSize.Width) + drawingSize.Width + 10;
        int height = (this.MinimumSize.Height - panelDraw.MinimumSize.Height) + drawingSize.Height + 10;
        this.Size = new Size(
            (width > this.MinimumSize.Width) ? width : this.MinimumSize.Width,
            (height > this.MinimumSize.Height) ? height : this.MinimumSize.Height);
        zeroDrawPosition = new Point((panelDraw.Size.Width - bitmapDraw.Width) / 2 - 1, (panelDraw.Size.Height - bitmapDraw.Height) / 2 - 1);
        using (Graphics g = panelDraw.CreateGraphics())
        {
            g.Clear(panelDraw.BackColor);
        }
        redrawDrawingLetter();
    }
public void redrawDrawingLetter()
    {
        bool[][] grid = collector.getArray(selectedName);
        using (Graphics graphicDraw = Graphics.FromImage(bitmapDraw))
        {
            graphicDraw.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
            graphicDraw.Clear(panelDraw.BackColor);
            int pxSize = pixelSizeArray[pixelSize];
            for (int y = 0; y < grid.Length; y++)
            {
                for (int x = 0; x < grid[y].Length; x++)
                {
                    graphicDraw.FillRectangle((grid[y][x] ? Brushes.Black : Brushes.White), x * (pxSize + 1), y * (pxSize + 1), pxSize, pxSize);
                }
            }
        }
        redrawDrawingPanel();
    }
private void redrawDrawingPanel()
    {
        using (Graphics g = panelDraw.CreateGraphics())
        {
            if (bitmapDraw != null)
                g.DrawImage(bitmapDraw, zeroDrawPosition);
        }
    }
private void panelDraw_Paint(object sender, PaintEventArgs e)
    {
        redrawDrawingPanel();
    }

没有人可以向我解释如何用C#画出最好的方法。所以也许我的代码不好,但这就是为什么我要问如何正确地做到这一点。

当用户点击 + - 按钮时,

newSizeDrawing仅由我自己调用。如果像素打开或关闭,我有bool双维数组。这是为微芯片和LED显示屏绘制字母的程序(通常为8px字母高度)。

我编写了一个方法来检查鼠标是否从一个“像素”移动到另一个“像素”,因此我不会在每次调用mouseMove事件后重绘它,因为“pixel”可以是10x10像素到30x30像素。

1 个答案:

答案 0 :(得分:1)

private void panelDraw_Paint(object sender, PaintEventArgs e)
{
    redrawDrawingPanel();
}

这从根本上说是错误的。 Paint事件通过e.Graphics让你绘制你想要绘制的任何东西。当你打开双缓冲时,e.Graphics引用一个位图,它用BackColor初始化。然后使用从CreateGraphics()获得的另一个 Graphics对象继续绘图。那个直接绘制到屏幕上。

如果非常发音,您会看到闪烁效果。一瞬间,您将看到其他Graphics上下文所绘制的内容。然后您的panelDraw_Paint()方法返回,Winforms绘制双缓冲位图。它上面没有任何内容,所以它会立即删除你画的内容。

修改redrawDrawingPanel()方法并为其指定一个Graphics类型的参数。在电话中传递e.Graphics。并且只使用那个Graphics对象,删除对CreateGraphics()的所有调用。