新建一个窗体。给窗体加一个LocationChanged或者Move事件。代码如下:
private void Form1_Move(object sender, EventArgs e)
{
if (Cursor.Position.X < 20)
{
this.Left = 0;
this.Top = 0;
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
}
else
{
this.Height = 300;
}
} 实现效果:1、把窗口拖动到屏幕左侧,窗口会吸附上去,怎么让窗口不要老是刷新闪烁?
2、吸附上去再拖出来的时候,设置高度为300,但是拖动完成后高度回到吸附时的高度,怎么解决??
private void Form1_Move(object sender, EventArgs e)
{
if (Cursor.Position.X < 20)
{
this.Left = 0;
this.Top = 0;
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
}
else
{
this.Height = 300;
}
} 实现效果:1、把窗口拖动到屏幕左侧,窗口会吸附上去,怎么让窗口不要老是刷新闪烁?
2、吸附上去再拖出来的时候,设置高度为300,但是拖动完成后高度回到吸附时的高度,怎么解决??
If Me.Left < 20 Then
Me.Location = New Point(0, 0)
Me.Height = Screen.PrimaryScreen.WorkingArea.Height
Else
Me.Height = 300
End If
End Sub
if (Cursor.Position.X < 20)
改為
if (this.Left< 20)
{
this.Left = 0;
this.Top = 0;
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
}
else
{
this.Height = 300;
}
你试下咯 `````
If Me.Left < 20 Then
Me.Location = New Point(0, 0)
If Me.Height <> Screen.PrimaryScreen.WorkingArea.Height Then Me.Height = Screen.PrimaryScreen.WorkingArea.Height
End If
Else
Me.Height = 300 End If
End Sub
关键是使用的事件不对
下面的方法基本能实现你希望的功能,但是不完美。首先添加窗体类的几个私有字段:
private int startX = -1;
private bool dock = false;
以及一个常量
private const int WM_NCLBUTTONDOWN = 161;startX记录开始拖动时窗口的Left,因为要区分是把窗口从中央往左侧拖还是相反。
dock指示是否要停靠在窗口左侧重写窗口的WndProc方法
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCLBUTTONDOWN) startX= this.Left; base.WndProc(ref m);
}
在此方法中截取鼠标左键在非客户区按下的消息,记录窗口的位置。添加Move事件处理方法
private void Form1_Move(object sender, EventArgs e)
{
if ((startX > 20) || (startX <0))
{
if ((this.Left < 20) && (this.Left >0))
{
this.Capture = false;
dock = true;
}
}
else
{
dock = false;
}
}
如果拖动从中央或者屏幕以外开始,并且窗口进入被吸附的区域,设置this.Capture为false,强制解除鼠标对窗口的控制,相当于鼠标左键抬起。注意两个判断条件不能在一条if语句里。添加Form1_LocationChanged事件处理方法
private void Form1_LocationChanged(object sender, EventArgs e)
{
if (dock)
{
this.Left = 0;
this.Top = 0;
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
}
else {
this.Height = 300;
}
}
这个很简单,判断是否停靠到左侧,相应设置窗口位置大小添加Form1_Resize事件处理方法 private void Form1_Resize(object sender, EventArgs e)
{
if (dock)
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
else
this.Height = 300;
}
如果不添加这个方法,那么把窗口从左侧拖动到中央时,系统会自动把窗口高度设置为拖动前的值。所以虽然它和LocationChanged方法重复还是不能缺少。当然也可以不用
Resize而用ResizeEnd,省略掉LocationChanged设置高度的代码,但是这样窗口大小就只能在鼠标按键放开后才会改变。这个方法有两个缺陷。
1. 在Move方法强制释放鼠标控制后,窗口会弹回到拖动前的位置,抵消掉在MOVE中设置窗口位置的效果,这就是为什么要在LocationChanged中进行设置的原因。也因为这个原因,窗口在被吸到左侧前会在拖动前的位置闪一下。
2. 在鼠标移动速度很快的情况下,有可能因为系统不能及时处理消息的缘故,会失去吸附的效果。
目前还没有找到解决的办法。
http://www.dotnet-tech.cn/view.asp?id=2
if (this.Left < 20)
{
this.Left = 0;
this.Top = 0;
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
this.Enabled = false;
this.Enabled = true;
this.Activate();
}