关于 用鼠标移动拖放 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标签的伪类选择器? ...
随机推荐
- 指针和指针运算符一起时的运算规则(比如*p++和*++p的区别)
接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1). 1.++i和i++的区别 如清单1(注意代码中的注释): #include <stdio.h> ...
- react的生命周期和使用
完整的生命周期 我们都知道生命周期分为三个大阶段: 挂载 更新 卸载 挂载的时候我们我们有 constructor . getDerivedStateFromProps .render . compo ...
- ubuntu16.04下载地址
ubuntu16.04下载地址: 中科大源 http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开源镜像站 http://mirrors.aliy ...
- Visual Studio 2010安装
学校要计算机二级证书,为了准备c语言的二级考试,要装Visual Studio 2010(Visual Studio 2022生成的文件过不了检测) 1-下载安装包 在这个网站上下载安装包 MSDN, ...
- android gradle配置及编译command
build.gradle apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.and ...
- 使用VS Code打造完美的嵌入式IDE
参考这个博主https://blog.csdn.net/qq_34245464/article/details/100769643的博文, 使用VS Code再重新打造一次完美的嵌入式IDE平台. 前 ...
- 修改 input框、textarea框的placeholder样式
/* 设置input框提示内容的样式 */ input::-webkit-input-placeholder { font-size: 14px; color: #ccc; font-weight: ...
- Centos 升级到指定内核
1. 准备阶段 下载安装包到进行升级服务器 wget -c https://acs-ecp.oss-cn-hangzhou.aliyuncs.com/rpm/kernel-4.19.1-rpm.tar ...
- css初始化、background属性、jquery选择器模糊匹配、canvas
1.css初始化 2.background 3.jquery选择器模糊匹配 4.canvas画多边形 5.通过css设置canvas背景图片 6.js动态生成变量名
- drf从入门到飞升仙界 04
序列化类常用字段和字段参数 常用字段类 #1 BooleanField BooleanField() #2 NullBooleanField NullBooleanField() #3 CharFie ...