FormBorderStyle设为None,移动Winform窗口的两种方法
2012-03-31 19:08
447 查看
第一种,利用windows的消息机制来实现:
首先﹐.定义鼠標左鍵按下時的Message标识﹔其次﹐在Form1_MouseDown方法﹐讓操作系統誤以為是按下标题栏。
1.定义鼠標左鍵按下時的Message标识
private const int WM_NCLBUTTONDOWN = 0XA1; //.定义鼠標左鍵按下
private const int HTCAPTION = 2;
2.讓操作系統誤以為是按下标题栏
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//為當前的應用程序釋放鼠標鋪獲
ReleaseCapture();
//發送消息﹐讓系統誤以為在标题栏上按下鼠標
SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
}
3.申明程序中所Windows的API函數
[DllImport("user32.dll",EntryPoint="SendMessageA")]
private static extern int SendMessage(int hwnd,int wMsg,int wParam,int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();
第二种,通过自定鼠标左键按下时产生的事件:
* 首先将窗体的边框样式修改为None,让窗体没有标题栏
* 实现这个效果使用了三个事件:鼠标按下、鼠标弹起、鼠标移动
* 鼠标按下时更改变量isMouseDown标记窗体可以随鼠标的移动而移动
* 鼠标移动时根据鼠标的移动量更改窗体的location属性,实现窗体移动
* 鼠标弹起时更改变量isMouseDown标记窗体不可以随鼠标的移动而移动
*/
private bool isMouseDown = false;
private Point FormLocation; //form的location
private Point mouseOffset; //鼠标的按下位置
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = true;
FormLocation = this.Location;
mouseOffset = Control.MousePosition;
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
int _x = 0;
int _y = 0;
if (isMouseDown)
{
Point pt = Control.MousePosition;
_x = mouseOffset.X - pt.X;
_y = mouseOffset.Y - pt.Y;
this.Location = new Point(FormLocation.X - _x, FormLocation.Y - _y);
}
}
首先﹐.定义鼠標左鍵按下時的Message标识﹔其次﹐在Form1_MouseDown方法﹐讓操作系統誤以為是按下标题栏。
1.定义鼠標左鍵按下時的Message标识
private const int WM_NCLBUTTONDOWN = 0XA1; //.定义鼠標左鍵按下
private const int HTCAPTION = 2;
2.讓操作系統誤以為是按下标题栏
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//為當前的應用程序釋放鼠標鋪獲
ReleaseCapture();
//發送消息﹐讓系統誤以為在标题栏上按下鼠標
SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
}
3.申明程序中所Windows的API函數
[DllImport("user32.dll",EntryPoint="SendMessageA")]
private static extern int SendMessage(int hwnd,int wMsg,int wParam,int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();
第二种,通过自定鼠标左键按下时产生的事件:
* 首先将窗体的边框样式修改为None,让窗体没有标题栏
* 实现这个效果使用了三个事件:鼠标按下、鼠标弹起、鼠标移动
* 鼠标按下时更改变量isMouseDown标记窗体可以随鼠标的移动而移动
* 鼠标移动时根据鼠标的移动量更改窗体的location属性,实现窗体移动
* 鼠标弹起时更改变量isMouseDown标记窗体不可以随鼠标的移动而移动
*/
private bool isMouseDown = false;
private Point FormLocation; //form的location
private Point mouseOffset; //鼠标的按下位置
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = true;
FormLocation = this.Location;
mouseOffset = Control.MousePosition;
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
int _x = 0;
int _y = 0;
if (isMouseDown)
{
Point pt = Control.MousePosition;
_x = mouseOffset.X - pt.X;
_y = mouseOffset.Y - pt.Y;
this.Location = new Point(FormLocation.X - _x, FormLocation.Y - _y);
}
}
相关文章推荐
- FormBorderStyle设为None,移动Winform窗口的两种方法
- FormBorderStyle设为None,移动Winform窗口的两种方法
- Winform 设置formborderStyle 为None后如何移动窗体
- Winform 设置formborderStyle 为None后如何移动窗体
- Winform无边框窗体(FormBorderStyle属性设为None)自定义移动
- winform 窗体属性FormBorderStyle 为none时使窗体可以被移动
- winform 窗体属性FormBorderStyle 为none时使窗体可以被移动
- winform中设置FormBorderStyle为None后点击任务栏自动最小化实现
- C++Builder设置完BorderStyle的值为none,以后如何实现窗口的移动和拉伸
- WinForm设置FormBorderStyle=none后仍可以使用任务栏左键和右键功能
- FormBorderStyle.None 改变窗口大小
- C#中form的窗体属性formborderstyle设置为none后就不能移动了
- FormBorderStyle.None 改变窗口大小
- 拖动窗体FormBorderStyle属性为None的窗体移动
- C#:form的窗体属性formborderstyle设置为none后就不能移动了
- WPF中设置了WindowStyle="None"后,窗口仍然有边框的解决方法
- WinForm 代码设置FormBorderStyle的属性
- Winform中在Form上截取消息的两种方法
- VB form 控制窗口BorderStyle 属性
- [转]Winform中在Form上截取消息的两种方法