在winform经常用到无边框的窗体,原因就是想使自己的程序界面完全的自定义,网上也有过不少的相关资料

今天我发了一下的午的时间整理了一下.觉得还不错,贴出来看看.

为了提高托动的缩放的效率,减少系统开销,一般软件都用支持只显示窗体四周的虚线的方法,这也是windows默认的设置

首先看下其它软件的窗体托动,先说QQ2009吧,QQ2009的主窗体在托动时如果在屏幕上来回快速托动,等停下来时你会发现,很有可能鼠标现在在窗体的位置已经不是按下的位置了.再说酷我音乐盒.鼠标在托动或缩放窗体时,如果鼠标移动到窗体的各边框上时,鼠标形状仍然会改变.而且就算系统设置设置成托动时显示窗体内容,在托动和缩放时也不会显示内容,仍然是虚线.此虚线遇到有些情况会很乱,比如在播放的动画的电影上时,因为直按用屏幕DC画的,而且放后破坏其它窗体的界面,其它的重画时,他就可能会不显示了下面介绍几种托动的方法

先说两种常用的,再补充说明

1.在mousemove,mousedown,mouseup三个事件的配合下来移动和缩放就不说了,代码多,效率低,一般初学者都能写出来.

2.就是用系统已经存在的方法,一般是重写窗口过程,和用sendmessage来骗系统.

重写回调函数的小例子

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截鼠标非客户区左键双击消息,决定窗体是否最大化显示
                    if (this.MaximizeBox)
                    {
                        base.WndProc(ref m);
                        this.Invalidate();
                    }
                    return;
                case WM_NCHITTEST://WM_NCHITTEST=132 <0x84> 
                    base.WndProc(ref m);//如果去掉这一行代码,窗体将失去MouseMove..等事件
                    Point lpint = new Point((int)m.LParam);//可以得到鼠标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放

m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>

//当然可以托动也可以改变大小了

//HTLEFT=10 <0xA> 左边框

//HTTOP=12 <0xC> 上边框

//HTTOPLEFT=13 <0xD>

//HTTOPRIGHT=14 <0xE>
                  //HTRIGHT=11 <0xB>

//HTBOTTOM=15 <0xF>

//HTBOTTOMLEFT=16 <0x10>

//HTBOTTOMRIGHT=17 <0x11>

//HTBORDER=18 <0x12>

//HTMINBUTTON=8 <0x8> 最小化按钮

//HTMAXBUTTON=9 <0x9> 最大化按钮

//HTCLOSE=20 <0x14> 关闭按钮

return;                
                default:
                    base.WndProc(ref m);
                    return;
            }
           
        }

发送消息的例子,也可以在上面的回函数中加入发送消息的方法,

也可以在窗体的mousedown..等事件和其它控件的事件里发送消息

记得要先释放鼠标用API函数ReleaseCapture();或控件的或窗体的Capture属性Capture = false;

API函数的声明我就不说了这里用到的API有三个,SetWindowLong可用可不用,只是用他来举另一个例子

[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SetWindowLong(IntPtr hWnd, int Index, long Value);

//托动

SendMessage(this.Handle, /*WM_SYSCOMMAND */274,/*移动信息SC_MOVE=*/61456+/*HTCAPTION =2*/2, 0);

//左边框缩放

SendMessage(this.Handle, /*WM_SYSCOMMAND */274,/*移动信息SC_Size=*/61440 +/*WMSZ_LEFT=1 <0x1> 这里可以换成其它参数下面给出*/1, 0);

//左边框WMSZ_LEFT=1 <0x1>

//右边WMSZ_RIGHT=2 <0x2>

//上边WMSZ_TOP=3 <0x3>

//WMSZ_TOPLEFT=4 <0x4>

//WMSZ_TOPRIGHT=5 <0x5>

//WMSZ_BOTTOM=6 <0x6>

//WMSZ_BOTTOMLEFT=7 <0x7>

//WMSZ_BOTTOMRIGHT=8 <0x8>

这里就可以完成两种方法的托动和缩放了,但 是还是和有边框的不一样,有边框的托动时和缩放时可以是很粗的虚线,而现在的却很细很细的.

这时就可以用上面提到过的SetWindowLong了,

SetWindowLong(this.Handle, GWL_STYLE, WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);

这样不但是粗边框了,而且系统菜单都有了,但是有一点不好,有兴趣的话自己可以研究下

而我用另一种方法觉得还可以,在窗体的MouseDown里这样写

private void Form1_MouseDown(object sender, MouseEventArgs e)
        {

this.Capture = false;
            Form ff = new Form();
            ff.StartPosition = FormStartPosition.Manual;
            ff.Size = this.Size;
            ff.Location = this.Location;
            //ff.Show();不让窗体显示

SendMessage(ff.Handle, 274, 61440+1, 0);//发送移动信息,也可以发送其它比如缩放消息

this.Size= ff.Size;
            this.Location = ff.Location;

ff.Dispose();

}

都看到这了,可不可以顶下啊...

再谈winform无边框窗体的鼠标托动与缩放相关推荐

  1. C# WinForm 无边框窗体,加阴影、拖动、改变大小等功能完美实现(自认为是完美的 ^=^)

    关于Winform的无边框窗体实现,网络上有很多大牛文章,这里不赘述.我也是参考网络上的思路,在使用别人的代码基础上,发现和遇到了很多小问题,所以做了改造,以下做个记录,也是给需要的人提供一点思路,如 ...

  2. WinForm 无边框窗体 拖动工作区移动窗体

    方案1 : 通过重载消息处理实现.重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个W ...

  3. C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

    方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private ...

  4. 再谈无边框窗体的操作

    本文介绍操作无边框窗体的其他几个方面的技巧. 设置浮动菜单 通常情况下,在无边框窗体中不能设置菜单.如果在无边框窗体中设置了菜单,运行时窗体上就会出现标题栏.那么,是否在无边框窗体中就不能使用菜单了呢 ...

  5. 通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷

    在winform程序中,有时会选择边框设计会none,但是这样就不能拖拽窗体移动 解决方案有二: 1,判断坐标控制拖拽 2.利用API函数, 下面介绍利用API函数,方便,快捷 #region 移动无 ...

  6. 01.WPF中制作无边框窗体

    [引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBor ...

  7. 拖动无边框窗体(VB6代码)

    简单代码片段,记录一下备用. Option Explicit Dim mX As Long, mY As Long Private Sub Form_MouseDown(Button As Integ ...

  8. Qt无边框窗体(Windows)

    Qt无边框窗体Windows篇 去掉标题栏和边框 实现拖拽功能 还原窗体功能 注意点 我们可以做的更好 添加阴影 亚克力面板效果 结语 去掉标题栏和边框 首先第一步我们要通过设置系统绘制的边框消失 s ...

  9. WPF 调用API修改窗体风格实现真正的无边框窗体

    原文:WPF 调用API修改窗体风格实现真正的无边框窗体 WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm ...

最新文章

  1. jQuery:动态改变html表单的目标页(Target)
  2. python是一门什么课程-Python究竟是一门怎样的语言,Python为什么这么火?
  3. Python爬虫基础面试题为2020年初大学生就业做准备(文末附教程)
  4. s3c2410开发环境建立
  5. 完美的项目从完美的表开始
  6. mybatis collection标签_一对多的关系,在MyBatis中如何映射?
  7. java正则表达式中的坑String.matches(regex)、Pattern.matches(regex, str)和Matcher.matches()
  8. libsvm回归参数寻优cgp_【lightgbm/xgboost/nn代码整理二】xgboost做二分类,多分类以及回归任务...
  9. 铺地毯(洛谷-P1003)
  10. Linux学习总结(20)——Linux 文件夹结构和作用
  11. MEME将于4月12日推出V2版本
  12. 记2020年秋季学期的微波期末考试
  13. Learn UML with JUDE(中文版)
  14. 关于消息队列的一些问题
  15. 小米蓝牙音响驱动_小米手机绝佳配件,20W无线闪充,支持唤醒小爱,只卖149
  16. c语言冒泡排序知识点,c语言冒泡排序
  17. [转载]视频格式介绍
  18. 2018计算机cpu调研,2018最新电脑处理器天梯图,进来了解下
  19. vue 仿外卖app-数据mock部分
  20. ruby--数值类(Numeric)

热门文章

  1. atlas 不稳定 mysql_连接确实很不稳定 · Issue #50 · Qihoo360/Atlas · GitHub
  2. Call to undefined method Illuminate\Database\Query\Builder::trashed()
  3. 未来30年推动全球经济增长的主要动力是数据资产
  4. LeetCode 第594题——最长和谐子序列
  5. qqwry.dat 导入mysql_纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
  6. 小评《加勒比海盗2》
  7. MyBatis(十四)MyBatis的缓存
  8. 计算机软件的反向工程,计算机软件反向工程需要满足哪些条件才算合法?
  9. java报告:小不点超市售货系统类图设计
  10. libpcap解析pcapng文件