感谢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);
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;
}
}