小弟想实现类似于vs2005鼠标拖放控件,界面无闪烁的效果,望大侠指点!!

解决方案 »

  1.   

    1.GDI+绘制
    使用双缓存
    开始拖放时隐藏控件,绘制矩形框代替控件视图,拖放结束还原。
    2.使用运行时设计器。DesignSurface、IDesignerHost等创建设计界面后,控件拖放和改变大小,设计器已经实现了该类功能。
      

  2.   

    能不能写个例子出来看看。
    [email protected]   
    万分感谢
      

  3.   

    给点简单点的实现。这种方法有一定局限。class UserMoveCtl
    {
    Control ctl;
    Control parent;
    bool moving;
    Point startPos;//控件起始的位置
    Size oldSize;  //控件初始大小 Point mouseDownPos;//鼠标按下时所在位置
    Point curPos;//改变后的控件位置
    Bitmap img;//控件绘制到图片(控件的SizeMode不是AutoSize时,需要绘制)
            
    //绑定事件,用户可以开始移动控件
    public void BindCtlMove(Control ctl)
    {
    this.ctl = ctl;
    parent = ctl.Parent; img = new Bitmap(ctl.Width, ctl.Height); ctl.MouseDown += new MouseEventHandler(ctl_MouseDown);
    ctl.MouseMove += new MouseEventHandler(ctl_MouseMove);
    ctl.MouseUp += new MouseEventHandler(ctl_MouseUp); parent.Paint += new PaintEventHandler(parent_Paint);
    } //取消移动
    public void Cancel()
    {
    ctl.MouseDown -= new MouseEventHandler(ctl_MouseDown);
    ctl.MouseMove -= new MouseEventHandler(ctl_MouseMove);
    ctl.MouseUp -= new MouseEventHandler(ctl_MouseUp);
    if (parent != null)
    {
    parent.Paint -= new PaintEventHandler(parent_Paint); }
    } void parent_Paint(object sender, PaintEventArgs e)
    {
    if (moving)
    {
    e.Graphics.DrawImage(img, curPos);
    }
    } void ctl_MouseUp(object sender, MouseEventArgs e)
    {
    moving = false;
    ctl.Location = curPos;
    ctl.Size = oldSize;
    } void ctl_MouseMove(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
         
    curPos = new Point(mouseDownPos.X + e.X - startPos.X, mouseDownPos.Y + e.Y - startPos.Y); 
    this.parent.Invalidate();
    } } void ctl_MouseDown(object sender, MouseEventArgs e)
    {
    mouseDownPos = ctl.Location;
    startPos = e.Location;
    ctl.DrawToBitmap(img, ctl.ClientRectangle);
    moving = true;
     
    oldSize = ctl.Size;
    ctl.Size = Size.Empty;
    }
    }
      

  4.   

    微软有个开源的SDK,另外还有个DEVELOPER,====