双缓冲在面板上不起作用?

时间:2013-03-16 15:28:08

标签: c# graphics doublebuffered

我正在制作类似ms画的小画作程序。目前,我正在尝试实施“选择功能”。我面临着闪烁的问题,所以我做了一些研究,我发现,我应该创建自己的Panel类。

public class MyDisplay : Panel
    {   
        public MyDisplay()
        {
            this.DoubleBuffered = true;            

            this.SetStyle(ControlStyles.UserPaint |
              ControlStyles.AllPaintingInWmPaint |
              ControlStyles.ResizeRedraw |
              ControlStyles.ContainerControl |
              ControlStyles.OptimizedDoubleBuffer |
              ControlStyles.SupportsTransparentBackColor
              , true);

            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.UpdateStyles();
        }
    }

主要形式有字段:

MyDisplay panel1 = new MyDisplay();
Graphics graphics1 = panel1.CreateGraphics();

我在面板上使用了3个事件:

  1. MouseDown - 我来到Point p1
  2. MouseMove - 那就是我遇到闪烁的问题,我正在打电话 每次点击鼠标移动graphics1.drawRectangle(...)graphics1.Clear()
  3. MouseUp - 我最后一次绘制矩形。
  4. 这有什么问题?为什么即使整个面板是白色的并且那里只有一个矩形,我仍然会遇到闪烁的问题?谢谢。

    编辑:

    我已经覆盖了OnPaint方法,但我仍然不知道下一步该做什么。

       protected override void OnPaint(PaintEventArgs e)
        {
            // Call the OnPaint method of the base class.
            base.OnPaint(e);
            // Call methods of the System.Drawing.Graphics object.
            e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle);
        } 
    

    EDIT2: 我应该在位图/图像上绘制并覆盖OnPaint方法从那里复制图像并将其粘贴到面板上吗?

1 个答案:

答案 0 :(得分:1)

删除定义 graphics1 字段的行。

使用通过PaintEventArgs对象传入的Graphics对象,在OnPaint的覆盖中执行所有绘制。使用方法Invalidate(),Refresh()和Update()来控制从其他代码重新绘制的时间。

如果您在使用此设计时遇到任何特定困难,请回电。