应为要实现矩形橡皮筋,
在画一个矩形的时候要把刚才画的矩形擦掉,
以前再次调用DrawFoucsRect就可以了,
现在该怎么办?我要实现矩形橡皮筋,不是简单的清除一个矩形。~0~

解决方案 »

  1.   

    感谢aspx.net.cn的xingze提供帮助。
              public struct RECT 

    public int left; 
    public int top; 
    public int right; 
    public int bottom; 
    }  public class GDI32
    {
    public const int R2_NOTXORPEN = 10; 
    [DllImport("GDI32.DLL")] 
    public static extern int SetROP2(IntPtr hdc,int nDrawMode);  
    } public class USER32
    {
    [DllImport("USER32.DLL")] 
    public static extern int DrawFocusRect(IntPtr hdc,ref RECT lpRect); 
    } public class ElasticWnd : AncWnd
    { private RECT rectangle; //事件Moving,当橡皮筋开始跳舞时触发
    public event RectangleEventHandler Selecting;
    public event RectangleEventHandler Selected;
    protected void OnSelecting(RectangleEventArgs e)
    {
    if (Selecting!=null)
    {
    Selecting(this,e);
    }
    } protected void OnSelected(RectangleEventArgs e)
    {
    if (Selected!=null)
    {
    Selected(this,e);
    }
    } protected override void OnMouseDown(MouseEventArgs e)
    {
    if(e.Button==MouseButtons.Left)
    { rectangle.left = rectangle.right = e.X;
    rectangle.top = rectangle.bottom = e.Y; this.Capture=true;
    DrawSelectRect();   //绘制 
    }
    base.OnMouseDown(e);
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
    if (e.Button==MouseButtons.Left)
    {
    this.Capture=false; DrawSelectRect();  //清除 
    RECT rc=NormalizeRect(rectangle); 
    OnSelected(new RectangleEventArgs(new Rectangle(rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top))); 
    rectangle.left=rectangle.right=0;
    rectangle.top=rectangle.bottom=0; }
    base.OnMouseUp(e);

    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
    if (e.Button==MouseButtons.Left )
    {
    DrawSelectRect();  //清除 
    rectangle.right=e.X;
    rectangle.bottom=e.Y;
    DrawSelectRect();  //绘制 
    } base.OnMouseMove(e);
    } private void DrawSelectRect() 

    Graphics g=this.CreateGraphics();
    IntPtr hDC;
    hDC=g.GetHdc();

    int nOldDrawMode=GDI32.SetROP2(hDC,GDI32.R2_NOTXORPEN); 
    RECT rc=NormalizeRect(rectangle);  if (nOldDrawMode!=GDI32.R2_NOTXORPEN)
    {
    //触发Moving事件,并传过Point;Size的值,两者用SPLIT连接";"
    OnSelecting(new RectangleEventArgs(new Rectangle(rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top)) );
    } USER32.DrawFocusRect(hDC,ref rc); 
    GDI32.SetROP2(hDC,nOldDrawMode); 

    g.ReleaseHdc(hDC);
    }  //标准化RECT结构 
    private RECT NormalizeRect(RECT rc)  

    RECT tmpRc=rc; 
    if (rc.left>rc.right) 

    tmpRc.left = rc.right; 
    tmpRc.right = rc.left; 

    if(rc.top > rc.bottom) 

    tmpRc.top = rc.bottom ; 
    tmpRc.bottom = rc.top; 

    return tmpRc; 
    }
    }