关于 用鼠标移动拖放 TabControl 标签 操作 实现 类
1.相关说明已有
2.本类有可以改进的地方,如更进,希望交流
3.对多行标签的支持没做特别解决,效果不太好
4.初学者使用,即可通过其构造函数直接加载需要赋予此拖放功能的 TabControl 即可实现,如: tabMover=new TabMover2(tabControl1,20);
/// <summary>
/// 标签鼠标边距感应触发拖移
/// 逻辑:可自定义 向左或向右拖放 感应边区宽度
/// 通用:是
/// 测试:正确
/// 使用:建议
/// 改进:有
///
/// 时间:202108122244-131150
/// 注:未对多行标签做特殊处理,在多行标签时可以将究使用
/// </summary>
public class TabMover2
{
TabControl tc;
TabPage clkTp, msTp;
Rectangle clkRct, msRct;
/// <summary>
/// 触发边距
/// </summary>
int trgBdr = 20;
int idx;
/// <summary>
///
/// </summary>
/// <param name="tc"></param>
public TabMover2(TabControl tc)
{
tc.MouseDown += _MouseDown;
tc.MouseMove += _MouseMove;
tc.MouseUp += _MouseUp; this.tc = tc;
}
public TabMover2(TabControl tc, int trgBdr)
{
tc.MouseDown += _MouseDown;
tc.MouseMove += _MouseMove;
tc.MouseUp += _MouseUp; this.tc = tc;
} private void _MouseUp(object sender, MouseEventArgs e)
{
tc.Cursor = Cursors.Default;
} private void _MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
clkTp = tc.SelectedTab;
//idx = tc.TabPages.IndexOf(clkTp);
//clkRct = tc.GetTabRect(idx);
}
}
private void _MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
tc.Cursor = Cursors.Hand; if (clkTp == null)
return; F.Ctrs.TC.Tab.Mos(tc, e, out msTp);
if (msTp == null)
return; if (msTp == clkTp)
return; idx = tc.TabPages.IndexOf(clkTp);
clkRct = tc.GetTabRect(idx); idx = tc.TabPages.IndexOf(msTp);
msRct = tc.GetTabRect(idx); if (msRct.Location.X > clkRct.Location.X)
{
if (e.X < msRct.Location.X + msRct.Width - trgBdr)
return;
}
else if (msRct.Location.X < clkRct.Location.X)
{
if (e.X > msRct.Location.X + trgBdr)
return;
} tc.TabPages.Remove(clkTp);
tc.TabPages.Insert(idx, clkTp); tc.SelectedTab = clkTp;
msTp = clkTp;
}
}
}
/// <summary>
/// 标签鼠标边距感应触发拖移[触发感应区域为向左或向右 端点 以拖动]
/// 逻辑:可自定义 向左或向右拖放 感应边区宽度,且首先以被拖动标签宽度与自定义边区宽度作为对比得出实际需要的感应边区宽度
/// 通用:是
/// 测试:正确
/// 使用:[在未完全使用情况总结下] 推荐
/// 改进:可能有待
///
/// 时间:202108131044-1150
/// 注:未对多行标签做特殊处理,在多行标签时可以将究使用
/// </summary>
public class TabMover3
{
TabControl tc;
TabPage clkTp, msTp;
Rectangle clkRct, msRct;
/// <summary>
/// 触发边距
/// </summary>
int trgBdr = 20, trgBdr_ = 20;
int idx;
/// <summary>
///
/// </summary>
/// <param name="tc"></param>
public TabMover3(TabControl tc)
{
tc.MouseDown += _MouseDown;
tc.MouseMove += _MouseMove;
tc.MouseUp += _MouseUp; this.tc = tc;
}
public TabMover3(TabControl tc, int trgBdr)
{
tc.MouseDown += _MouseDown;
tc.MouseMove += _MouseMove;
tc.MouseUp += _MouseUp; this.tc = tc;
this.trgBdr = trgBdr;
}
private void _MouseUp(object sender, MouseEventArgs e)
{
tc.Cursor = Cursors.Default;
} private void _MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
clkTp = tc.SelectedTab;
}
}
private void _MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
tc.Cursor = Cursors.Hand; if (clkTp == null)
return; F.Ctrs.TC.Tab.Mos(tc, e, out msTp);
if (msTp == null)
return; if (msTp == clkTp)
return; idx = tc.TabPages.IndexOf(clkTp);
clkRct = tc.GetTabRect(idx); idx = tc.TabPages.IndexOf(msTp);
msRct = tc.GetTabRect(idx); if (msRct.Width > clkRct.Width)
{
if (trgBdr > clkRct.Width)
trgBdr_ = clkRct.Width;
else
trgBdr_ = trgBdr;
}
else
trgBdr_ = trgBdr; if (msRct.Location.X > clkRct.Location.X)
{
if (e.X < msRct.Location.X + msRct.Width - trgBdr_)
return;
}
else if (msRct.Location.X < clkRct.Location.X)
{
if (e.X > msRct.Location.X + trgBdr_)
return;
} tc.TabPages.Remove(clkTp);
tc.TabPages.Insert(idx, clkTp); tc.SelectedTab = clkTp;
msTp = clkTp;
}
}
}
交流 QQ : 2412366909@qq.com
手机号码:177-7499-4428
注:本人测试过程中暂未发现造成存取不正确的问题
关于 用鼠标移动拖放 TabControl 标签 操作 实现 类的更多相关文章
- day53——标签操作
day53 今日内容 标签操作 值操作 取值: 文本输入框:$('#username').val(); input,type=radio单选框: $('[type="radio"] ...
- 前端09 /jQuery标签操作、事件、补充
前端09 /jQuery标签操作.事件.补充 目录 前端09 /jQuery标签操作.事件.补充 1.标签内文本操作 1.1 html标签元素中的所有内容 1.2 text 标签元素的文本内容 2.文 ...
- 前端08 /jQuery标签操作、事件
前端08 /jQuery标签操作.事件 目录 前端08 /jQuery标签操作.事件 1.标签内文本操作 1.1 html标签元素中的所有内容 1.2 text 标签元素的文本内容 2.文档标签操作 ...
- Delphi的TListView控件拖放选定行操作
http://www.tansoo.cn/?p=401 Delphi的TListView控件拖放选定行操作的例子,效果图如下:TListView控件拖动选定行到指定位置 具体实现步骤: 一.新建一个D ...
- Git 标签操作
允许有意义的名称到一个特定的版本库中的标签操作.Tom 决定标记他们的项目代码,以便他们以后可以更容易访问. 创建标签 让我们标记当前HEAD使用git tag命令.他提供的标记名称前加上-a选项,使 ...
- jQuery标签操作
样式操作 样式类操作 //添加指定的css类名 $('元素选择器')addClass('类名'); //移除指定的css类名 removeClass(); //判断样式存不存在 hasClass(); ...
- 前端(六)—— 伪类选择器:a标签的伪类、内容伪类、索引伪类、取反伪类
a标签的伪类.内容伪类.索引伪类.取反伪类 一.a标签的四大伪类 :link:未访问状态 :hover:悬浮状态 :active:活跃状态 :visited:已访问状态 四大伪类也可用于其他标签 &l ...
- XML格式示例 与 XML操作(读取)类封装
header('Content-Type: text/xml'); <?xml version="1.0" encoding="utf-8" standa ...
- CSS学习笔记-03- 过渡模块之前奏篇 a标签的伪类选择器
CSS3 2D转换CSS3 3D转换CSS3 过渡CSS3 动画 CSS3 的四大金刚. 想要实现酷炫的视觉效果,上面4个是必须要掌握的.学习之前,先复习一下 视觉盛宴的前菜 :a标签的伪类选择器 铛 ...
- HTML连载63-a标签的伪类选择器
一.a标签的伪类选择器 1.通过观察可以发现a标签存在一定状态 (1)默认状态,从未被访问过 (2)被访问过的状态 (3)鼠标长按的状态 (4)鼠标悬停在a标签上的演示 2.什么是a标签的伪类选择器? ...
随机推荐
- linux 使用tc做限速
#!/bin/bash#针对不同的ip进行限速 #清空原有规则tc qdisc del dev em3 root #创建根序列tc qdisc add dev em3 root handle 1: h ...
- 关于osqp
看了osqp的英文概要,记录如下: 1.采用交替方向乘子法 2.通过因式分解高速缓冲和热启动可以减少运算时间 3.适合嵌入式系统,实测mpc在10ms之内,路径规划在20ms左右(少障碍物),障碍物多 ...
- 采集地图商家电话,导出到excel
快速的把高德地图左边的搜索列表里的商家地图,电话,导出到EXCEL里. 采集地图商家电话,可以快速提高销售人员的业绩. 如何快速地将高德地图里的商家电话资料导出EXCEL? 操作步骤: 1. 选择你要 ...
- 全国分乡镇第六次人口普查数据shp数据库省市区县街道
全国分乡镇第六次人口普查数据shp数据库省市区县街道 ==名称:全国第六次人口普查任意十个乡镇的乡镇界地图==数据说明:精确到乡镇级别.==数据:面数据,属性列表(乡镇名.乡镇代码,第六次人口普查分乡 ...
- 10 个常用的 JS 工具库,80% 的项目都在用!
Day.js 一个极简的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持一样, 但体积仅有2KB. npm install dayjs 基本用法 import ...
- xshell he xftp下载网址
https://www.xshell.com/zh/free-for-home-school/
- prometheus 对接飞书告警
prometheus对接飞书告警 环境 名称 ip地址 cpu 内存 yz-feishu 10.65.6.91 4c 8G 飞书创建群组机器人,参考飞书官网 https://www.feishu.cn ...
- Software--Java--远程调试
Java 远程调试的原理是两个 VM 之间通过debug 协议进行通信,然后以达到远程调试的目的.两者之间可以通过socket进行通信. 步骤: 1. 首先被 debug 程序的虚拟机在启动时要开启d ...
- 计算机网络基础(3):IP与子网掩码/ ping/ ipconfig/ VLAN/ 网络服务器配置
chapter4 构建中型网络 1. IP地址与子网掩码 A类地址:网络ID开头是0,范围从00000001到01111110,126个,其中0 127留作他用.在每个网段里(网络ID),可以容纳2* ...
- 通过cmd对数据库SQL进行创建表空间并创建用户
通过cmd对数据库SQL进行创建表空间并创建用户 1.创建表空间:create tablespace stx(名字) datafile ' 目录路径\stx(名字).dbf ' size 64m; 2 ...