65.9K
CodeProject 正在变化。 阅读更多。
Home

启用通过鼠标移动来移动窗体(使用自定义控件)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.33/5 (6投票s)

2007年8月10日

CPOL

2分钟阅读

viewsIcon

53060

downloadIcon

632

在窗体边框样式为“无”的情况下,通过自定义控件启用鼠标移动来处理窗体移动。

引言

我构建这个控件是为了在将窗体边框样式设置为“无”时,能够移动该窗体。

背景

我们面临的问题是,当我们想构建非矩形窗体时。为此,我们在窗体上放置图片,并将其边框样式设置为“无”。

在这种情况下,我们需要处理如何使用鼠标更改窗体在屏幕上的位置。

我通过构建一个自定义控件来解决这个问题,当我们将该控件添加到窗体上时,它就增加了这个功能。

使用代码

首先,要通过鼠标移动来启用窗体移动,我们需要处理 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;

}

}

 
© . All rights reserved.