大侠 我收先向你致敬!  发招了!   我做windform 用户控件  继承UserControl!
在控见上使用UserControl1_Paint  重绘控件上的图案!  现在要求控件上的图案是可以拖动的
我已经在UserControl1_MouseMove判定好了边界!
1:怎么才能实现拖动恩
2:拖动的时候有重影子要怎么消除

解决方案 »

  1.   

    托动时不要不停的Paint整个图案。
    先用个虚线框,最后mousedown的时候再把图案画上去。可以使用双缓冲。
      

  2.   

    用ControlPaint.DrawReversibleLine可以画虚线框// When the mouse hovers over Button3, two reversible lines are 
    // drawn using the corner coordinates of Button3, which are first 
    // converted to screen coordinates.
    private void Button3_MouseHover(object sender, System.EventArgs e)
    {
        ControlPaint.DrawReversibleLine(Button3.PointToScreen(
            new Point(0, 0)), Button3.PointToScreen(
            new Point(Button3.ClientRectangle.Right, 
            Button3.ClientRectangle.Bottom)), SystemColors.Control);
        
        ControlPaint.DrawReversibleLine(Button3.PointToScreen(
            new Point(Button3.ClientRectangle.Right, 
            Button3.ClientRectangle.Top)), 
            Button3.PointToScreen(new Point(Button1.ClientRectangle.Left, 
            Button3.ClientRectangle.Bottom)), SystemColors.Control);
    }// When the mouse moves from Button3, the reversible lines are erased by
    // using the same coordinates as are used in the Button3_MouseHover method.
    private void Button3_MouseLeave(object sender, System.EventArgs e)
    {
        ControlPaint.DrawReversibleLine(Button3.PointToScreen(
            new Point(0, 0)), Button3.PointToScreen(
            new Point(Button3.ClientRectangle.Right, 
            Button3.ClientRectangle.Bottom)), SystemColors.Control);
        
        ControlPaint.DrawReversibleLine(Button3.PointToScreen(
            new Point(Button3.ClientRectangle.Right, 
            Button3.ClientRectangle.Top)), 
            Button3.PointToScreen(new Point(Button3.ClientRectangle.Left,
            Button3.ClientRectangle.Bottom)), SystemColors.Control);
    }
      

  3.   

    参考// The following three methods will draw a rectangle and allow 
    // the user to use the mouse to resize the rectangle.  If the 
    // rectangle intersects a control's client rectangle, the 
    // control's color will change.bool isDrag = false;
    Rectangle theRectangle = new Rectangle
        (new Point(0, 0), new Size(0, 0));
    Point startPoint;private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {    // Set the isDrag variable to true and get the starting point 
        // by using the PointToScreen method to convert form 
        // coordinates to screen coordinates.
        if (e.Button==MouseButtons.Left)
        {
            isDrag = true;
        }    Control control = (Control) sender;    // Calculate the startPoint by using the PointToScreen 
        // method.
        startPoint = control.PointToScreen(new Point(e.X, e.Y));
    }private void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {    // If the mouse is being dragged, 
        // undraw and redraw the rectangle as the mouse moves.
        if (isDrag)        // Hide the previous rectangle by calling the 
            // DrawReversibleFrame method with the same parameters.
        {
            ControlPaint.DrawReversibleFrame(theRectangle, 
                this.BackColor, FrameStyle.Dashed);        // Calculate the endpoint and dimensions for the new 
            // rectangle, again using the PointToScreen method.
            Point endPoint = this.PointToScreen(new Point(e.X, e.Y));
            int width = endPoint.X-startPoint.X;
            int height = endPoint.Y-startPoint.Y;
            theRectangle = new Rectangle(startPoint.X, 
                startPoint.Y, width, height);        // Draw the new rectangle by calling DrawReversibleFrame
            // again.  
            ControlPaint.DrawReversibleFrame(theRectangle, 
                this.BackColor, FrameStyle.Dashed);
        }
    }private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {    // If the MouseUp event occurs, the user is not dragging.
        isDrag = false;    // Draw the rectangle to be evaluated. Set a dashed frame style 
        // using the FrameStyle enumeration.
        ControlPaint.DrawReversibleFrame(theRectangle, 
            this.BackColor, FrameStyle.Dashed);    // Find out which controls intersect the rectangle and 
        // change their color. The method uses the RectangleToScreen  
        // method to convert the Control's client coordinates 
        // to screen coordinates.
        Rectangle controlRectangle;
        for(int i = 0; i < Controls.Count; i++)
        {
            controlRectangle = Controls[i].RectangleToScreen
                (Controls[i].ClientRectangle);
            if (controlRectangle.IntersectsWith(theRectangle))
            {
                Controls[i].BackColor = Color.BurlyWood;
            }
        }    // Reset the rectangle.
        theRectangle = new Rectangle(0, 0, 0, 0);
    }
      

  4.   

    既然图案要拖动,怎么会写在Paint里?