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 标签 操作 实现 类的更多相关文章

  1. day53——标签操作

    day53 今日内容 标签操作 值操作 取值: 文本输入框:$('#username').val(); input,type=radio单选框: $('[type="radio"] ...

  2. 前端09 /jQuery标签操作、事件、补充

    前端09 /jQuery标签操作.事件.补充 目录 前端09 /jQuery标签操作.事件.补充 1.标签内文本操作 1.1 html标签元素中的所有内容 1.2 text 标签元素的文本内容 2.文 ...

  3. 前端08 /jQuery标签操作、事件

    前端08 /jQuery标签操作.事件 目录 前端08 /jQuery标签操作.事件 1.标签内文本操作 1.1 html标签元素中的所有内容 1.2 text 标签元素的文本内容 2.文档标签操作 ...

  4. Delphi的TListView控件拖放选定行操作

    http://www.tansoo.cn/?p=401 Delphi的TListView控件拖放选定行操作的例子,效果图如下:TListView控件拖动选定行到指定位置 具体实现步骤: 一.新建一个D ...

  5. Git 标签操作

    允许有意义的名称到一个特定的版本库中的标签操作.Tom 决定标记他们的项目代码,以便他们以后可以更容易访问. 创建标签 让我们标记当前HEAD使用git tag命令.他提供的标记名称前加上-a选项,使 ...

  6. jQuery标签操作

    样式操作 样式类操作 //添加指定的css类名 $('元素选择器')addClass('类名'); //移除指定的css类名 removeClass(); //判断样式存不存在 hasClass(); ...

  7. 前端(六)—— 伪类选择器:a标签的伪类、内容伪类、索引伪类、取反伪类

    a标签的伪类.内容伪类.索引伪类.取反伪类 一.a标签的四大伪类 :link:未访问状态 :hover:悬浮状态 :active:活跃状态 :visited:已访问状态 四大伪类也可用于其他标签 &l ...

  8. XML格式示例 与 XML操作(读取)类封装

    header('Content-Type: text/xml'); <?xml version="1.0" encoding="utf-8" standa ...

  9. CSS学习笔记-03- 过渡模块之前奏篇 a标签的伪类选择器

    CSS3 2D转换CSS3 3D转换CSS3 过渡CSS3 动画 CSS3 的四大金刚. 想要实现酷炫的视觉效果,上面4个是必须要掌握的.学习之前,先复习一下 视觉盛宴的前菜 :a标签的伪类选择器 铛 ...

  10. HTML连载63-a标签的伪类选择器

    一.a标签的伪类选择器 1.通过观察可以发现a标签存在一定状态 (1)默认状态,从未被访问过 (2)被访问过的状态 (3)鼠标长按的状态 (4)鼠标悬停在a标签上的演示 2.什么是a标签的伪类选择器? ...

随机推荐

  1. agl---atumotive grade linux开篇

    linux本人也玩过,捯饬过双系统win7+Ubuntu,搞过虚拟机跑fedora,做开发,除了觉得酷,能接触到整个程序开发.编译.链接,程序效率高外,没觉得啥好,关键生态也无丰富,我这种伪码农,也就 ...

  2. Unity Shader-反射效果(CubeMap,Reflection Probe,Planar Reflection,Screen Space Reflection)

    https://blog.csdn.net/puppet_master/article/details/80808486

  3. 接入B站iframe视频(bilibili引用视频)

    感谢 https://blog.csdn.net/xinshou_caizhu/article/details/94028606 我们在查看其它资料的时候,视频总加载失败,后来发现是少了 https: ...

  4. Harbor离线安装

    一.安装docker-compose 1-1. #安装方式一 curl -SL https://github.com/docker/compose/releases/download/v2.11.2/ ...

  5. CF1067E 题解

    题意 传送门 给定一棵 \(n\) 个节点的树,每条边有 \(\frac{1}{2}\) 的概率出现,可以得到一个森林,求这个森林邻接矩阵的秩的期望. \(1\le n\le5\times10^5\) ...

  6. el-form不进行校验可能的原因

    可能原因 el-form至少需要:model="你的数据form",:rules='你的校验规则' 的属性: 只能校验el-input,不能对原始input进行校验 (大坑).

  7. Github快速访问

    Github快速访问 1. 国内访问github慢     github是国外网站,用国内的网络很难访问到,也就无法使用github,作为程序猿的我们,无法使用github可太难受了,那么我们有什么办 ...

  8. el-scrollbar 饿了么滚动条不出现 bug

    el-scrollbar 饿了么滚动条不出现 bug 解决方法:el-scrollbar 的直接子元素样式需要设置为 display: inline-block;

  9. feign的工作原理

    1.开发微服务时,我们会在微服务的主程序入口添加EnableFignClient注解开启对Feign Client扫描加载处理,根据FignClient接口规范,定义接口并加上FignClient注解 ...

  10. oracle常用知识随笔

    1.创建表空间及用户赋权 create tablespace spaceone datafile '/dev/spaceone'size 80mextent management localsegme ...