您的位置:首页 > 其它

.Net 环境下实现可变大小的无标题窗口拖动

2005-01-17 14:52 435 查看
在 .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 写起代码~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: