1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Winform鼠标拖动改变控件大小 移动控件位置

Winform鼠标拖动改变控件大小 移动控件位置

时间:2022-08-07 23:29:58

相关推荐

Winform鼠标拖动改变控件大小 移动控件位置

基本逻辑:

1、鼠标移动过程(未按下鼠标左键)进行边界检测,当移动到控件边界时(某范围内),改变显示的光标;

2、此时,若按下鼠标左键(也可是右键),记录鼠标的位置和控件的大小;

3、按下鼠标左键移动过程中,改变控件的大小(三个方向)或者location(五个方向);

4、逻辑完善:进行边界检测;

5、编写为自己的类,可以用于初始化控件使其具有鼠标拖动改变大小的功能。

数据准备:方向枚举,用于记录方向

publicenumMouseDirection{East,West,South,North,Southeast,Southwest,Northeast,Northwest,None}

鼠标移动:这列出了四个方向分别为东南、西北、西南、东北

if(e.Location.X>=control.Width-5&&e.Location.Y>=control.Height-5){control.Cursor=Cursors.SizeNWSE;direction=MouseDirection.Southeast;}elseif(e.Location.X<=5&&e.Location.Y<=5){control.Cursor=Cursors.SizeNWSE;direction=MouseDirection.Northwest;}elseif(e.Location.X<=5&&e.Location.Y>=control.Height-5){control.Cursor=Cursors.SizeNESW;direction=MouseDirection.Southwest;}elseif(e.Location.X>=control.Width-5&&e.Location.Y<=5){control.Cursor=Cursors.SizeNESW;direction=MouseDirection.Northeast;}

点击左键,记录信息

if(e.Button==MouseButtons.Left){mouseDownPoint=e.Location;oldSize=control.Size;}

按下左键移动

if(e.Button==MouseButtons.Left){if(direction!=MouseDirection.None)//改变大小{PointoldLocation=control.Location;ResizeControl(e.Location);//改变大小的方法if(EventControlResize!=null)//自定义改变大小事件EventControlResize(newControlInfo(control.Location,oldLocation,control.Size,oldSize,direction));}else//移动位置{PointoldLocation=control.Location;control.Cursor=Cursors.SizeAll;Pointlocation=GetPointToParent(newPoint(e.Location.X-mouseDownPoint.X,e.Location.Y-mouseDownPoint.Y));RelocationControl(location);//改变位置的方法if(EventControlLocationChanged!=null)//自定义改变位置事件EventControlLocationChanged(newControlInfo(control.Location,oldLocation,control.Size,oldSize,direction));}}

改变东南(右下)方向,control为拖动的控件,direction为方向,高和宽分开计算,最小值为10,最大值为右和下到达父容器边界

privatevoidResizeControl(Pointp){PointmousePosition=GetPointToParent(p);//将控件内坐标转换为父容器坐标Pointlocation=control.Location;if(direction==MouseDirection.Southeast)//东南{control.Cursor=Cursors.SizeNWSE;if(mousePosition.X-control.Left<=10){mousePosition.X=control.Left+10;control.Width=10;}elseif(mousePosition.X-control.Left>=control.Parent.Width-control.Left){mousePosition.X=control.Parent.Width;control.Width=control.Parent.Width-control.Left;}else{control.Width=mousePosition.X-control.Left;}if(mousePosition.Y-control.Top<=10){mousePosition.Y=control.Top+10;control.Height=10;}elseif(mousePosition.Y-control.Top>=control.Parent.Height-control.Top){mousePosition.Y=control.Parent.Height;control.Height=control.Parent.Height-control.Top;}else{control.Height=mousePosition.Y-control.Top;}}

}

改变位置的方法

privatevoidRelocationControl(Pointlocation){if(location.X<0){location.X=0;}elseif(location.X>control.Parent.Width-control.Width){location.X=control.Parent.Width-control.Width;}if(location.Y<0){location.Y=0;}elseif(location.Y>control.Parent.Height-control.Height){location.Y=control.Parent.Height-control.Height;}control.Location=location;//control.Parent.Refresh();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。