启用通过鼠标移动来移动窗体(使用自定义控件)
在窗体边框样式为“无”的情况下,通过自定义控件启用鼠标移动来处理窗体移动。
引言
我构建这个控件是为了在将窗体边框样式设置为“无”时,能够移动该窗体。
背景
我们面临的问题是,当我们想构建非矩形窗体时。为此,我们在窗体上放置图片,并将其边框样式设置为“无”。
在这种情况下,我们需要处理如何使用鼠标更改窗体在屏幕上的位置。
我通过构建一个自定义控件来解决这个问题,当我们将该控件添加到窗体上时,它就增加了这个功能。
使用代码
首先,要通过鼠标移动来启用窗体移动,我们需要处理 3 个事件。第一个是鼠标按钮按下时 (Parent_MouseDown),第二个是鼠标移动且鼠标按钮按下时 (Parent_MouseMove),最后一个是鼠标按钮释放时 (Parent_MouseUp)。
示例控件代码是:
public partial class HandelFormMove : Control
{
private Point mouseOffset;
private bool isMouseDown = false;
System.Windows.Forms.Form fr;
public HandelFormMove()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
// TODO: 添加自定义绘图代码
// 调用基类 OnPaint
// base.OnPaint(pe);
}
/// <summary>
/// 通过初始化窗体位置来启用窗体移动
/// 并将标志 (isMouseDown) 设置为 true
/// 以启用通过鼠标移动来移动窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Parent_MouseDown(object sender, MouseEventArgs e)
{
int xOffset;
int yOffset;
// MessageBox.Show("click");
if (e.Button == MouseButtons.Left)
{
// 根据鼠标指针的当前位置将坐标分配给 mouseOffset 变量。
// 根据当前鼠标指针的位置,将坐标分配给 mouseOffset 变量。
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight -
SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
}
/// <summary>
/// 检查标志 (isMouseDown) 是否为 true
/// 根据鼠标位置更改窗体位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Parent_MouseMove(object sender, MouseEventArgs e)
{
// 如果按下了左鼠标按钮。
if (isMouseDown)
{
// 将窗体的 Location 属性设置为新位置。
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
fr.Location = mousePos;
}
}
/// <summary>
/// 完成窗体移动
/// 通过将标志 (isMouseDown) 设置为 false
/// 以禁用通过鼠标移动来移动窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Parent_MouseUp(object sender, MouseEventArgs e)
{
// 更改 isMouseDown 字段,以便除非用户按下左鼠标按钮,否则窗体不会移动。
// 除非用户按下左鼠标按钮,否则窗体不会移动。
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
/// <summary>
///
/// </summary>
protected override void OnCreateControl()
{
//base.OnCreateControl();
fr = (System.Windows.Forms.Form)this.Parent;
fr.MouseDown += new MouseEventHandler(Parent_MouseDown);
fr.MouseMove += new MouseEventHandler(Parent_MouseMove);
fr.MouseUp += new MouseEventHandler(Parent_MouseUp);
this.Visible = false;
}
}