有时候要实现无边框的winform窗体,由于没有边框了,所以缩放功能没有了,同时也不能拖动窗体。在实际应用中,我们经常会有一个窗体的头部来显示Title,需要在这个头部左键双击实现缩放以及左键按住实现拖动。
缩放时,应该首先设置窗体的默认长、宽及与屏幕的左边距和上边距。
拖动时,根据鼠标位置移动窗体位置。
两个操作都是根据MouseDown事件来操作的,所以要理清思路。
双击缩放,在第一次点击时,设置过期时间,若在过期时间内在此点击,则改变窗体大小。
拖动时,需要MouseDown、MouseUp、MouseMove同时配合,在MouseDown是第一次触发时,记录当前鼠标位置,并设置属性左键按下标记leftFlag为true。若leftFlag为true移动鼠标,则在MouseMove事件下开始移动窗体,MouseUp事件中改变左键按下标记leftFlag为false。
过期时间:
Timer timer = new Timer();
点击次数:
clickTime=0;
左键按下标志:
leftFlag=false;
窗体初始化时设置过期时间:
timer.Interval = 300;
timer.Tick += (s, e1) => { timer.Stop();clickTime = 0; };
MouseMove事件:
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if(leftFlag)
{
PointmouseSet = Control.MousePosition;
mouseSet.Offset(mPoint.X,mPoint.Y);
Location = mouseSet;
}
}
MouseUp事件:
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
leftFlag = false;
}
MouseDown事件:
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
clickTime++;
timer.Start();
if (clickTime % 2 == 0)
{
this.WindowState = this.WindowState == FormWindowState.Maximized ?FormWindowState.Normal : FormWindowState.Maximized;
clickTime = 0;
}
else
{
if(!leftFlag)
{
mPoint.X = -e.X;
mPoint.Y = -e.Y;
leftFlag = true;
}
else
{
leftFlag = false;
}
}
}