第
C#创建磁性窗体的实现方法
目录一、磁性窗体二、磁性窗体的实现方法(1)无标题窗体的移动(2)Left属性(3)Top属性二、设计一个磁性窗体的实例(1)资源管理器Resources.Designer.cs设计(2)公共类Frm_Play.cs(3)主窗体1.Frm_Play.cs2.Frm_Play.Designer.cs(4)子窗体11.Frm_ListBox.cs2.Frm_ListBox.Designer.cs(5)子窗体21.Frm_Libretto.cs2.Frm_Libretto.Designer.cs(6)生成效果
一、磁性窗体
经常会遇到一种情况,即当拖动一个窗体(主窗体)时,其他窗体(子窗体)随着该窗体移动,当拖动子窗体时,其他窗体将不跟随移动,这就是磁性窗体。
二、磁性窗体的实现方法
在主窗体移动时,通过改变跟随窗体的Left和Top属性值实现磁性。
(1)无标题窗体的移动
无标题窗体的移动主要是通过控件来移动窗体,比如,用Panel控件来进行。首先,在Panel控件的MouseDown事件中将鼠标按下时的位置值(负值)存入到全局变量CPoint中,代码如下:
privatevoidpanel_Title_MouseDown(objectsender,MouseEventArgse)
CPoint=newPoint(-e.X,-e.Y);//获取鼠标按下时的位置
然后,在Panel控件的MouseMove事件中按照CPoint变量的值,以屏幕坐标平移指定的量,并用平移后的结果设置窗体的DesktopLocation属性,代码如下:
privatevoidpanel_Title_MouseMove(objectsender,MouseEventArgse)
if(e.Button==MouseButtons.Left)
PointmyPosittion=Control.MousePosition;//获取当前鼠标的屏幕坐标
myPosittion.Offset(CPoint.X,CPoint.Y);//以屏幕坐标平移指定的量
DesktopLocation=myPosittion;//设置当前窗体在屏幕上的位置
}
(2)Left属性
该属性用于获取或设置控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。语法格式如下:
publicintLeft{get;set;}
属性值:窗体左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。
(3)Top属性
该属性用于获取或设置控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。语法格式如下:
publicintTop{get;set;}
参数说明属性值:窗体上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。
二、设计一个磁性窗体的实例
本实例将制作一个磁性窗体,当拖动主窗体移动时,两个子窗体如果相连,则跟随移动。
三个窗体:主窗体Frm_Play.cs,2个子窗体:Frm_ListBox.cs、Frm_Libretto.cs;鼠标按下任一窗体顶部的控件,可以拖动窗体;拖动子窗体时,会使得粘在一起的窗体分开,拖动主窗体时会使粘在一起的子窗体随动;拖动主窗体靠近子窗体小于相互吸引的缝隙10时,松开鼠标,靠近的窗体会像磁铁一样吸引在一起;主窗体吸引子窗体后,该子窗体还可以吸引其它子窗体;双击主窗体的控件,激活所有窗体;
(1)资源管理器Resources.Designer.cs设计
项目使用的图片资源应设计到资源管理器,详见本文作者写的其它文章:详解C#如何手动改变自制窗体的大小_C#教程_()
(2)公共类Frm_Play.cs
//类设计
namespace_185
internalclassFrmClass
#region磁性窗体-公共变量
//记录窗体的隐藏与显示
publicstaticboolFrm_ListShow=false;
publicstaticboolFrm_LibrettoShow=false;
publicstaticboolFrm_ScreenShow=false;
//记录鼠标的当前位置
publicstaticPointCPoint;
publicstaticPointFrmPoint;
publicstaticintGap=10;//设置窗体间相互吸引的缝隙尺寸
//Frm_Play窗体的位置