.Net 环境下实现可变大小的无标题窗口拖动
2005-01-17 14:52
441 查看
在 .Net 环境下实现无标题窗口拖动,听起来似乎是比较简单的,相信很多人以前都在VB、VC、Delphi等环境,轻易实现过,我当然也觉得没什么大不了了,不过,实际的情况,还是有那么一点点出乎意料~~
通常来讲,有以下两种无标题窗口拖动的常用实现方法:
方法一:
在 OnMouseDown 事件处理时记录鼠标的 oldPos —〉在 OnMouseMove 事件处理时取得当前鼠标坐标,将窗体移动到当前位置;
方法二:
在 OnMouseDown事件处理中 利用 WinAPI 向窗体发送 WM_NCLBUTTONDOWN 消息,模拟在窗体的标题栏点击鼠标左键操作;
典型的调用的代码可能是这样:
private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HTCAPTION = 2;
[DllImport("user32.dll")]
private static extern int SendMessage (int hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();
private void form_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
}
下面来分析一下以上两种方法的效果:
很明显,方法一,通常不被建议使用,因为拖动时会产生窗体边框阴影,不美观;而方法二由于是模拟鼠标点击,效果基本是完美的。
但是,如果我需要窗体是可变大小的呢?
为什么会问这个问题呢?因为,当我们实现无标题窗体时,会将窗体的 FormBorderStyle 设为 None,但是,这样一来,窗体就是不能用鼠标改变大小的(就是不能用鼠标拖动窗体边框使窗体变大变小),不符合我们的要求。
幸运的是
聪明的程序员找到了这样的解决办法,将窗体的 FormBorderStyle 属性设为 Sizable, ControlBox 属性设为False,并且在窗体的 OnLoad事件处理中,设置窗体的Text,也就是标题内容为 string.Empty,Good,看起来真不错,窗体无标题、可拖动、可变大小,完美的解决方案!?
然而
注意上面的解决方案将窗体的标题内容设为 string.Empty 了,虽然实现了我们要的效果,但是,运行时在任务栏上显示的窗体按钮变为 图标后面跟空白 了,这可不是我想要的,嘿,我最小化窗体时可不希望任务栏上显示空百啊~~!可是,Form.Text 不为 string.Empty 标题栏就会显示出来呢~~ 当然勉强还能接受~~大不了这个窗体我不在任务栏显示出来嘛~~
但是,还有更恐怖的事发生:如果窗体的 Text 属性值为 string.Empty ,则这个窗体不能作为模式对话框使用,也就是说,对这个窗体的任何实例,不能调用,ShowDialog() 否则一调用,窗体就自动关闭~~
我的天哪!当发现这一点时,我深深的郁闷,并为自己先前的努力哀悼!
于是,暂时还没找到如下效果的完美解决方案
怎样实现一个 “窗体显示时无标题、可拖动、可变大小、任务栏上显示时有标题的窗体”?
妥协
暂时只能这样妥协:当我需要在任务栏上显示有标题,而窗体显示无标题、可拖动,并且窗体可能作为模式对话框使用时,放弃窗体的可变大小功能(就是不能用鼠标拖动窗体边框使窗体变大变小),当然,对以上“完美解决方法”的改变是,将窗体的 FormBorderStyle 属性设为 None,这时,是可以设置窗体的Text属性,也就是标题值。
在心里深深埋怨了一下 Bill 叔叔,然后接着打开 VS.Net 写起代码~~~
通常来讲,有以下两种无标题窗口拖动的常用实现方法:
方法一:
在 OnMouseDown 事件处理时记录鼠标的 oldPos —〉在 OnMouseMove 事件处理时取得当前鼠标坐标,将窗体移动到当前位置;
方法二:
在 OnMouseDown事件处理中 利用 WinAPI 向窗体发送 WM_NCLBUTTONDOWN 消息,模拟在窗体的标题栏点击鼠标左键操作;
典型的调用的代码可能是这样:
private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HTCAPTION = 2;
[DllImport("user32.dll")]
private static extern int SendMessage (int hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();
private void form_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
}
下面来分析一下以上两种方法的效果:
很明显,方法一,通常不被建议使用,因为拖动时会产生窗体边框阴影,不美观;而方法二由于是模拟鼠标点击,效果基本是完美的。
但是,如果我需要窗体是可变大小的呢?
为什么会问这个问题呢?因为,当我们实现无标题窗体时,会将窗体的 FormBorderStyle 设为 None,但是,这样一来,窗体就是不能用鼠标改变大小的(就是不能用鼠标拖动窗体边框使窗体变大变小),不符合我们的要求。
幸运的是
聪明的程序员找到了这样的解决办法,将窗体的 FormBorderStyle 属性设为 Sizable, ControlBox 属性设为False,并且在窗体的 OnLoad事件处理中,设置窗体的Text,也就是标题内容为 string.Empty,Good,看起来真不错,窗体无标题、可拖动、可变大小,完美的解决方案!?
然而
注意上面的解决方案将窗体的标题内容设为 string.Empty 了,虽然实现了我们要的效果,但是,运行时在任务栏上显示的窗体按钮变为 图标后面跟空白 了,这可不是我想要的,嘿,我最小化窗体时可不希望任务栏上显示空百啊~~!可是,Form.Text 不为 string.Empty 标题栏就会显示出来呢~~ 当然勉强还能接受~~大不了这个窗体我不在任务栏显示出来嘛~~
但是,还有更恐怖的事发生:如果窗体的 Text 属性值为 string.Empty ,则这个窗体不能作为模式对话框使用,也就是说,对这个窗体的任何实例,不能调用,ShowDialog() 否则一调用,窗体就自动关闭~~
我的天哪!当发现这一点时,我深深的郁闷,并为自己先前的努力哀悼!
于是,暂时还没找到如下效果的完美解决方案
怎样实现一个 “窗体显示时无标题、可拖动、可变大小、任务栏上显示时有标题的窗体”?
妥协
暂时只能这样妥协:当我需要在任务栏上显示有标题,而窗体显示无标题、可拖动,并且窗体可能作为模式对话框使用时,放弃窗体的可变大小功能(就是不能用鼠标拖动窗体边框使窗体变大变小),当然,对以上“完美解决方法”的改变是,将窗体的 FormBorderStyle 属性设为 None,这时,是可以设置窗体的Text属性,也就是标题值。
在心里深深埋怨了一下 Bill 叔叔,然后接着打开 VS.Net 写起代码~~~
相关文章推荐
- .Net 环境下实现可变大小的无标题窗口拖动
- .Net 环境下实现可变大小的无标题窗口拖动
- java中 实现无标题无边框的窗体能够用鼠标拖动改变窗口大小
- pyqt实现自定义窗口拖动大小,到桌面边框自动影藏
- 实现拖动无标题窗口的5种方法
- c#实现无标题栏窗口的拖动
- Pyqt实现无边框窗口拖动以及窗口大小改变
- C# 实现无标题栏窗口拖动效果
- 实现CDHtmlDialog无标题栏拖动窗口
- node-webkit学习之【无边框窗口用JS实现拖动改变大小等】
- 【.Net】 实现窗口拖动
- Pyqt实现无边框窗口拖动及改变窗口大小
- 拖动table标题实现改变td的大小(css+js代码)
- 【积累】利用WM_NCHITTEST消息实现无标题窗口的拖动
- C# 实现无标题栏窗口拖动效果
- 实现拖动无标题窗口的5种方法
- 如何在 PB 中实现无标题可拖动的窗口
- c# 实现用鼠标拖动没有标题栏的窗口(窗体的任何部分都可实现拖动效果)
- 拖动table标题实现改变td的大小(css+js代码)
- 利用WM_NCHITTEST消息实现无标题窗口的拖动