将form从下面的FormBase类继承,拖动form上的任意一点都可移动.并且解决了原方案中如果将formBorderStyle设置成none之后,MouseMove的第一下有个跳动的问题.可用于不规则窗体的制作.
public class FormBase : Form
{
Declarations#region Declarations
private bool drag = false;
private Point start_point = new Point(0, 0);
private bool draggable = true;
private string exclude_list = "";
/**//// <SUMMARY>
/// Required designer variable.
/// </SUMMARY>
private IContainer components = null;
#endregion
Constructor , Dispose#region Constructor , Dispose
public FormBase()
{
InitializeComponent();
//
//Adding Mouse Event Handlers for the Form
//
MouseDown += new MouseEventHandler(Form_MouseDown);
MouseUp += new MouseEventHandler(Form_MouseUp);
MouseMove += new MouseEventHandler(Form_MouseMove);
}
/**//// <SUMMARY>
/// Clean up any resources being used.
/// </SUMMARY>
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
Windows Form Designer generated code#region Windows Form Designer generated code
/**//// <SUMMARY>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </SUMMARY>
private void InitializeComponent()
{
//
// FormBase
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(369, 182);
this.Name = "FormBase";
this.Text = "AlerterForm";
}
#endregion
Overriden Functions#region Overriden Functions
protected override void OnControlAdded(ControlEventArgs e)
{
//
//Add Mouse Event Handlers for each control added into the form,
//if Draggable property of the form is set to true and the control
//name is not in the ExcludeList.Exclude list is the comma seperated
//list of the Controls for which you do not require the mouse handler
//to be added. For Example a button.
//
if (Draggable && (ExcludeList.IndexOf(e.Control.Name) == -1))
{
e.Control.MouseDown += new MouseEventHandler(Form_MouseDown);
e.Control.MouseUp += new MouseEventHandler(Form_MouseUp);
e.Control.MouseMove += new MouseEventHandler(Form_MouseMove);
}
base.OnControlAdded(e);
}
#endregion
Event Handlers#region Event Handlers
void Form_MouseDown(object sender, MouseEventArgs e)
{
//
//On Mouse Down set the flag drag=true and
//Store the clicked point to the start_point variable
//
if (e.Button == MouseButtons.Left)
{
drag = true;
start_point = new Point(e.X, e.Y);
}
}
void Form_MouseUp(object sender, MouseEventArgs e)
{
//
//Set the drag flag = false;
//
if (e.Button == MouseButtons.Left)
{
drag = false;
}
}
void Form_MouseMove(object sender, MouseEventArgs e)
{
//
//If drag = true, drag the form
//
if (drag)
{
Top += e.Y - start_point.Y;
Left += e.X - start_point.X;
}
}
#endregion
Properties#region Properties
public string ExcludeList
{
set { exclude_list = value; }
get { return exclude_list.Trim(); }
}
public bool Draggable
{
set { draggable = value; }
get { return draggable; }
}
#endregion
}
{
Declarations#region Declarations
private bool drag = false;
private Point start_point = new Point(0, 0);
private bool draggable = true;
private string exclude_list = "";
/**//// <SUMMARY>
/// Required designer variable.
/// </SUMMARY>
private IContainer components = null;
#endregion
Constructor , Dispose#region Constructor , Dispose
public FormBase()
{
InitializeComponent();
//
//Adding Mouse Event Handlers for the Form
//
MouseDown += new MouseEventHandler(Form_MouseDown);
MouseUp += new MouseEventHandler(Form_MouseUp);
MouseMove += new MouseEventHandler(Form_MouseMove);
}
/**//// <SUMMARY>
/// Clean up any resources being used.
/// </SUMMARY>
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
Windows Form Designer generated code#region Windows Form Designer generated code
/**//// <SUMMARY>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </SUMMARY>
private void InitializeComponent()
{
//
// FormBase
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(369, 182);
this.Name = "FormBase";
this.Text = "AlerterForm";
}
#endregion
Overriden Functions#region Overriden Functions
protected override void OnControlAdded(ControlEventArgs e)
{
//
//Add Mouse Event Handlers for each control added into the form,
//if Draggable property of the form is set to true and the control
//name is not in the ExcludeList.Exclude list is the comma seperated
//list of the Controls for which you do not require the mouse handler
//to be added. For Example a button.
//
if (Draggable && (ExcludeList.IndexOf(e.Control.Name) == -1))
{
e.Control.MouseDown += new MouseEventHandler(Form_MouseDown);
e.Control.MouseUp += new MouseEventHandler(Form_MouseUp);
e.Control.MouseMove += new MouseEventHandler(Form_MouseMove);
}
base.OnControlAdded(e);
}
#endregion
Event Handlers#region Event Handlers
void Form_MouseDown(object sender, MouseEventArgs e)
{
//
//On Mouse Down set the flag drag=true and
//Store the clicked point to the start_point variable
//
if (e.Button == MouseButtons.Left)
{
drag = true;
start_point = new Point(e.X, e.Y);
}
}
void Form_MouseUp(object sender, MouseEventArgs e)
{
//
//Set the drag flag = false;
//
if (e.Button == MouseButtons.Left)
{
drag = false;
}
}
void Form_MouseMove(object sender, MouseEventArgs e)
{
//
//If drag = true, drag the form
//
if (drag)
{
Top += e.Y - start_point.Y;
Left += e.X - start_point.X;
}
}
#endregion
Properties#region Properties
public string ExcludeList
{
set { exclude_list = value; }
get { return exclude_list.Trim(); }
}
public bool Draggable
{
set { draggable = value; }
get { return draggable; }
}
#endregion
}
参考文献
1.http://www.codeproject.com/useritems/DraggableForm.asp
2.http://www.codeproject.com/csharp/irregularshapedform.asp