C#使用橡皮筋画法,因为每次鼠标移动做两件事情:
1 擦除原来的
2 画出新的 
可是(比如画矩形) ,当两个矩形有重叠部分时,由于后画的矩形把先前画的矩形重叠部分擦出了,所以会出现斑点,甚至重叠部分消失,请问怎么解决???

解决方案 »

  1.   

    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; 
    }
    }