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

在 .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)
        
{
            
//为当前的应用程序释放鼠标捕获
            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 写起代码~~~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值