今天我正试图用闪烁的面板解决问题,当我画上它时。
我读过很多线程,比如:
所以我尝试使用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像素。
答案 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()的所有调用。