【发布时间】:2012-07-09 20:59:55
【问题描述】:
今天,当我在上面画画时,我正在尝试解决闪烁面板的问题。
我读过很多帖子,比如这些:
- how to stop flickering C# winforms,
- Double buffering with Panel,
- How can I draw on Panel so it does not blink?
所以我尝试使用 doubleBuffered 在 PictureBox、MyPanel 上绘图,但是当我阅读时发现的最佳解决方案是,我不能每次都使用 g.Clear(),之后即使在非 doubleBuffered 面板上也是如此,闪烁消失了。
我什至读到,我应该在绘制完成后释放图形。所以我到处使用(Graphics g = panel.CreateGraphics())。
所以我的问题,仅当我在位图上绘制一些东西时才为位图创建图形是个好主意吗?因为在我创建 Bitmap 和 Graphics 之前(只针对这个位图,不是针对所有组件),所以我每次都有这个位图可用的 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 事件后重新绘制它,因为“像素”可以从 10x10 像素到 30x30 像素。
【问题讨论】:
-
嗨 Arxeiss,你有什么代码可以说明你在做什么吗?通过一些代码示例,人们可以查看您在做什么,并提出改进建议或同意您实施的内容 - 分享想法也更容易!
-
不要不使用 CreateGraphics(),双缓冲只能在使用 Paint 事件时起作用。并且不在您的事件处理程序中处置 e.Graphics 对象,您没有创建它。
-
我在第一个帖子中添加了代码。因为我没有双缓冲面板,我仍然可以使用 CreateGraphics,不是吗?但感谢您的解释。