在你的Toolbar的构造函数里加上
this.SetStyle(ViewStyles.UserPaint|ViewStyles.AllPaintingInWmPaint |ViewStyles.DoubleBuffer, true);
这样则绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁。要完全启用双重缓冲,还必须将 UserPaint 和 AllPaintingInWmPaint 样式位设置为 true。
具体看MSDN

解决方案 »

  1.   

    这儿的this是frm还是toolbar?如果是toolbar,构造函数是写在控件中,我没法改吧?而toolbar对象并没有暴露出SetStyle()方法。如果是frm,我尝试过,结果是ToolBar直接出现一堆乱七八糟的效果:)我还是觉得类似delphi中的beginupdate()和endupdate()的方法
    比较可靠,由外部程序来控制Paint消息。gzing....
      

  2.   

    另外,不知道ViewStyles是否应该是ControlStyles?
      

  3.   

    用这个,hwndLock为窗口句柄,完成后传null参数而解除锁定[DllImport("user32.dll", EntryPoint="LockWindowUpdate")]
    public static extern int LockWindowUpdate (
    IntPtr hwndLock
    );
      

  4.   

    用 LockWindowUpdate 方法可达到理想效果,但在 .NET 里用 WindowsAPI 总觉得不爽。用 .NET 的 SetStyles 方法不行,还是闪烁,不知为什么:
    this.SetStyle(ControlStyles.DoubleBuffer | 
          ControlStyles.UserPaint | 
          ControlStyles.AllPaintingInWmPaint,
          true);
       this.UpdateStyles();
    还是用的不对?
      

  5.   

    我想this是指你要先继承了Toolbar
      

  6.   

    用API怎么不爽?涉及到绘图效率的肯定是能用API就用API。this.SetStyle(ControlStyles.DoubleBuffer | 
          ControlStyles.UserPaint | 
          ControlStyles.AllPaintingInWmPaint,
          true);
       this.UpdateStyles();
    你对窗体设置双缓冲当然没用,要想对ToolBar用双缓冲,你必须自己派生一个,既然是UserPaint,然后你就慢慢重新画一个ToolBar吧……
      

  7.   

    你当然要自己先继承一个Toolbar,在该Toolbar的构造函数里写SetStyle。而不是在Form
    的构造函数里写这句
      

  8.   

    在控件的构造函数中添加以下语句:
    SetStyle ( ControlStyles.DoubleBuffer , true ) ; // 设置双缓冲,防止图像抖动
    SetStyle ( ControlStyles.AllPaintingInWmPaint , true ) ; // 忽略系统消息,防止图像闪烁