【C#】组件分享:FormDragger窗体拖拽器
适用:.net2.0+ winform项目
介绍:
类似QQ、迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随性度或更甚。先看效果:

可拖拽的地方包括不限于:
- 窗体、Panel、GroupBox、TabControl等容器控件的空白区;
- 菜单栏、工具栏、状态栏等bar的空白区,以及无效项目;
- Label、PictureBox、ProgressBar等通常不与鼠标交互的控件;
- 一切无效控件(Enabled为false);
基本上就是你觉得应该可以拖的地方都可以拖。
用法:
先看公开成员:
//拖拽器开关
bool Enabled { get; set; } //排除列表。可向其中添加或移除控件实例,处于列表中的控件不接受拖拽
List<Control> ExcludeControls { get; } //事件:准备拖拽时发生,可用e.Cancel = true取消拖拽,e还携带其它信息
event EventHandler<FormDraggingCancelEventArgs> Dragging; //事件:拖拽器开关状态改变后
event EventHandler EnabledChanged;
使用挺简单,随时随地FormDragger.Enabled = true/false就能开闭拖拽功能,比如在Main函数中就可以开好,完了程序内的所有自建窗体就可以愉快的拖拽了,但是,像消息框MessageBox、各种对话框(如打开文件对话框)等由系统提供的窗体不能拖,原因是这些窗口的消息不进入程序,需要勾子才能捕获到,犯不着(其实方案里已经实现了一个DialogDragger.cs,就是用来拖系统对话框的,但已知颜色选择对话框ColorDialog存在问题,所以暂时没集成,后面感觉有必要且解决了再更新,建议Watch)。关于消息框,也可以选用这个,由于是自制,所以可以拖。
对于适用拖拽规则的控件,鼠标左键点击消息(如MouseDown)是到不了它的,因为被拦截了,所以注册了这类事件也不会触发,若希望某个可拖控件不被拖到,例如某个图片框,你希望它具备“超链”的功能,点上去时执行注册好的MouseDown事件处理方法,那么有两种方式可以实现例外:
- 将该控件加入例外列表:FormDragger.ExcludeControls.Add(pictureBox1);
- 注册FormDragger.Dragging事件,在事件处理方法中,传入的e有一个Control属性,表示点到的控件,所以可以判断e.Control是否你要例外的控件,若是,令e.Cancel = true即可;此外e还携带别的信息,如鼠标位置、坐标类型等供辅助判断;
以上场景在源码中都有示例供参考。
原理:
利用Application.AddMessageFilter向程序加入消息过滤器,拦截并处理发往程序窗体的鼠标左键单击消息,若满足逻辑,则拦下该消息,并往控件所在的窗体发送点击标题栏的消息,达到点击该控件时系统认为是点到窗体标题栏的效果。更多信息请前往下面的地址查看。
方案所在:
https://github.com/ahdung/FormDraggerDemo【优先】
https://coding.net/u/ahdung/p/FormDraggerDemo/git
http://git.oschina.net/ahdung/FormDraggerDemo
方案中已写测试器,就是截图那个样子,欢迎下载体验。
-文毕-
【C#】组件分享:FormDragger窗体拖拽器的更多相关文章
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...
- 【C#】组件分享:FormDragger-窗体拖拽器
适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...
- Qt之股票组件-自选股--列表可以拖拽、右键常用菜单
目录 一.开头嘴一嘴 二.效果展示 三.自选股列表 1.列表初始化 2.添加Item 3.右键菜单 4.拖拽Item 5.刷新数据 四.相关文章 原文链接:Qt之股票组件-自选股--列表可以拖拽.右键 ...
- 在 Element-UI 的 Table 组件上添加列拖拽效果
Element-UI 的 Table组件很强大,但是我们的需求更强大... 简单粗暴的来一发效果图: 一.数据驱动 传统的拖动效果,都是基于通过 mousedown.mousemove.mouseup ...
- WPF实现无边框窗体拖拽右下角▲ 改变窗体大小【framwork4.0】 谢谢大家关注
效果图:(右下角拖拽改变窗体大小) 第一步:添加xaml代码: <Border Name="ResizeBottomRight" MouseMove="Resize ...
- vue组件实现图片的拖拽和缩放
vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学习和钻研一下,一个好的组件必须有其必不可少的有优点:一是能提高应用开发效率.测试性.复用性等:二是组件应该是高内聚.低耦合的:三是 ...
- Qt之窗体拖拽、自适应分辨率、自适应大小 good
Qt之自定义界面(实现无边框.可移动) Qt之自定义界面(窗体缩放-跨平台终极版) Qt之自定义界面(窗体缩放) http://blog.csdn.net/liang19890820/article/ ...
- JS面向对象组件(六) -- 拖拽功能以及组件的延展
HTML部分 <div id="div1"></div> <div id="div2"></div> CSS部分 ...
- Qt之窗体拖拽、自适应分辨率、自适应大小
简述 在自定义无边框.标题栏的界面中,需要自己实现最小化.最大化.关闭.窗体背景等功能.最小化.最大化.关闭等按钮设计及功能比较简单,这里就不多做介绍.今天主要介绍一下绘制背景的问题,主要实现自适应屏 ...
随机推荐
- HTTP响应状态码说明
当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(Server Header)用以响应浏览器的请求. HTTP状态码共分为五种类型: 1**:信息,服务器接收到请求,需 ...
- wpf数据绑定 - StringFormat的妙用
写在前面 WPF中常常有这样的情况:需要在UI上显示一些信息,比如显示一张图片的信息,信息结构是: 图片名:Xxx 图片尺寸:Xxx 而其中的 Xxx 通常通过数据绑定来获得, Xxx 前面的内容是需 ...
- ABP框架入门踩坑-添加实体
添加实体 ABP踩坑记录-目录 这里我以问答模块为例,记录一下我在创建实体类过程中碰到的一些坑. 审计属性 具体什么是审计属性我这里就不再介绍了,大家可以参考官方文档. 这里我是通过继承定义好的基类来 ...
- 20164321 王君陶 Exp1 PC平台逆向破解
一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...
- jzoj5843
给定 n 个正整数序列 ,每个序列长度为m. 选择至少 1 个序列,在每个被选择的序列中选择一个元素,求出所有被选择的元素的 gcd. 求所有方案的结果之和,答案对 1e9+7 取模.两种方案不同,当 ...
- Django(完整的登录示例、render字符串替换和redirect跳转)
day61 1. 登录的完整示例 复习: form表单往后端提交数据需要注意哪三点: 五一回来默写 <-- 谁写错成from谁 ...
- fail2ban
在 [DEFAULT] 全局配置中的ignoreip选项中添加被放行的ip地址:ignoreip = 127.0.0.1 172.17.1.218 网段可以加 127.0.0.1/8,用空格隔开就行. ...
- sqlCAST使用详解
(1).CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型.以下例子用于将文本字符串'12'转换为整型: SELECT CAST('12' AS int) (2).返回值是 ...
- web worker原理 && SSE原理
第一部分 什么是 web worker? 我们一直强调JavaScript是单线程的,但是web worker的出现使得JavaScript可以在多线程上跑,只是web worker本身适合用于一些复 ...
- openssl生成RSA格式的公私钥,并转为pkcs8格式
第一步:生成私钥,这里我们指定私钥的长度为2048 openssl genrsa -out rsa_private_key.pem 2048 第二步:根据私钥生成对应的公钥: openssl rsa ...