通常来讲,有以下两种无标题窗口拖动的常用实现方法:
方法一:
在 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)
{
//为当前的应用程序释放鼠标捕获
ReleaseCapture();
//发送消息,让系统误以为你在标题拦上按下鼠标
SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
}
}
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)
{
//为当前的应用程序释放鼠标捕获
ReleaseCapture();
//发送消息,让系统误以为你在标题拦上按下鼠标
SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
}
}
下面来分析一下以上两种方法的效果:
很明显,方法一,通常不被建议使用,因为拖动时会产生窗体边框阴影,不美观;而方法二由于是模拟鼠标点击,效果基本是完美的。
但是,如果我需要窗体是可变大小的呢?
为什么会问这个问题呢?因为,当我们实现无标题窗体时,会将窗体的 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 写起代码~~~