Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#绘图-最佳解决方案_C#_.net_Drawing_Panel - Fatal编程技术网

C#绘图-最佳解决方案

C#绘图-最佳解决方案,c#,.net,drawing,panel,C#,.net,Drawing,Panel,今天我试图用一个闪烁的面板来解决这个问题,当我在上面画的时候 我读了很多文章,比如: , , 所以我试着在PictureBox上画图,我的面板带有双缓冲区,但我发现最好的解决方案是,当我阅读时,我不能每次都使用g.Clear(),之后,即使在非双缓冲面板上,闪烁也消失了 我甚至读到,画画完成后我应该释放图形。所以我使用(Graphics g=panel.CreateGraphics())随处可见 所以我的问题是,仅在绘制位图时才为位图创建图形是一个好主意吗?因为在我创建位图和图形之前(仅针

今天我试图用一个闪烁的面板来解决这个问题,当我在上面画的时候

我读了很多文章,比如:

  • ,
  • ,
所以我试着在PictureBox上画图,我的面板带有双缓冲区,但我发现最好的解决方案是,当我阅读时,我不能每次都使用g.Clear(),之后,即使在非双缓冲面板上,闪烁也消失了

我甚至读到,画画完成后我应该释放图形。所以我使用(Graphics g=panel.CreateGraphics())随处可见

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

这是我的密码:

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();
    }
public void newSizeDrawing()
{
Size Size=collector.getLetterSize(selectedName);
大小drawingSize=新大小(Size.Width*(pixelSizeArray[pixelSize]+1)、Size.Height*(pixelSizeArray[pixelSize]+1));
bitmapDraw=新位图(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.MinimumSize.width)?宽度:this.MinimumSize.width,
(高度>此.MinimumSize.height)?高度:此.MinimumSize.height);
zeroDrawPosition=新点((panelDraw.Size.Width-bitmapDraw.Width)/2-1,(panelDraw.Size.Height-bitmapDraw.Height)/2-1);
使用(Graphics g=panelDraw.CreateGraphics())
{
g、 清晰(拼板画。背景色);
}
重新绘制DrawingLetter();
}
公共作废重绘DrawingLetter()
{
bool[][]grid=collector.getArray(selectedName);
使用(Graphics graphicDraw=Graphics.FromImage(bitmapDraw))
{
graphicDraw.CompositingQuality=System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
graphicDraw.Clear(panelDraw.BackColor);
int pxSize=pixelSizeArray[pixelSize];
对于(int y=0;y
没有人能向我解释如何用C#最好的方式画画。所以,也许我的代码不好,但这就是为什么我问如何正确地执行它的原因

newSizeDrawing
仅在用户单击+-按钮时由我自己调用。我有布尔双维数组,如果像素是开或关。这是用于为微芯片和LED显示器绘制字母的程序(通常为字母高度的8像素)

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

private void panelDraw_Paint(object sender, PaintEventArgs e)
{
    redrawDrawingPanel();
}
这是根本错误的。Paint事件通过e.Graphics,让您可以绘制任何要绘制的内容。当您启用双缓冲时,例如图形指位图,它将用背景色初始化。然后,使用从CreateGraphics()获得的另一个图形对象继续绘制。那一个直接画到屏幕上

你看到的闪烁效果非常明显。在一瞬间,您可以看到其他图形上下文绘制的内容。然后,panelDraw_Paint()方法返回,Winforms绘制双缓冲位图。上面什么也没有,所以它会立即擦除你画的东西


修改redrawDrawingPanel()方法,并为其提供一个Graphics类型的参数。在通话中传递e.图形。并且仅使用该图形对象,删除对CreateGraphics()的所有调用

嗨Arxeiss,你有什么代码来说明你在做什么吗?通过一些代码示例,人们可以看到您正在做的事情,或者提出改进建议,或者同意您所实现的内容——分享想法也更容易!不要使用CreateGraphics(),双缓冲只能在使用Paint事件时工作。不要在事件处理程序中处理e.Graphics对象,它不是您创建的。我在First post中添加了代码。因为我没有双缓冲面板,我仍然可以使用CreateGraphics,不是吗?但是谢谢你的解释。我现在有点困惑。如果我不能使用CreateGraphics(),在调整面板大小时,我应该在哪里使用g.Clear()?(面板具有锚定顶部、左侧、底部、右侧,并且只有通过程序我才能调整窗体大小,正如您在
public void newSizeDrawing()
中所看到的那样?如果我不能使用CreateGraphics()的话,那么立即重新绘制的函数又如何呢?ThanksSet ResizeRedraw=构造函数中的true,因此当面板调整大小时会触发绘制。使用Invalidate()当你知道有什么变化时。在哪个construktor?我不使用我自己的面板。但是Ivalidate很好,每次调整大小时我都可以调用它,因为,就像我写的,你只能通过按钮来调整大小。这对我来说就够了。感谢muchI现在尝试删除所有CreateGraphics和all Clear(),只在Paint事件中绘制,效果非常好:)非常感谢,但最后一件事,我必须使用Graphics.FromImage()来绘制位图,稍后我会在Paint event to Panel中绘制位图。或者我可以用另一种方式?我使用位图,因为面板需要重新绘制后,我不必绘制整个图像,