• .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 写起代码~~~
  • 相关阅读:
    动手动脑3
    动手动脑2
    编写一个文件分割工具,能把一个大文件分割成多个小的文件。并且能再次把他们合并起来得到完整的文件
    编写一个文件加解密程序通过命令行完成加解密工作
    编写一个程序指定一个文件夹,能自动计算出其总容量
    Java中常见的异常处理汇总
    覆盖 动手动脑
    课堂代码验证
    如何在静态方法中访问类的实例成员 及查询“你已经创建了多少个对象”
    Java的字段初始化规律
  • 原文地址:https://www.cnblogs.com/teddyma/p/93110.html
Copyright © 2020-2023  润新知