关于 用鼠标移动拖放 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标签的伪类选择器? ...
随机推荐
- SAP日志表 CDHDR和CDPOS
1. 标准日志表CDHDR 和 CDPOS OBJECTCLAS = 'INFOSATZ' 信息记录 OBJECTCLAS = 'BANF' 采购申请 OBJECTCLAS = 'EINKBELEG' ...
- C# 笔记--Sendkeys winform窗体控件回车及全选
SendKeys.Send() 向活动应用程序发送击键 SendKeys.SendWait() 向活动应用程序发送给定的键,然后等待消息被处理 这两个方法可以发送组合键,需要注意的是字母按键应为小写. ...
- tomcat多主多备
主服务器默认轮询,当主服务器全部挂了,就会访问备机backup,备机也默认轮询
- (读书笔记)基于CMMI的软件工程及实训指导------第一章软件工程基础
第一章------软件工程基础 1.软件工程基本原理 (1)按照软件生命周期的阶段划分制订计划,严格依据计划进行管理 (2)坚持进行阶段评审 (3)实行严格的产品控制 (4)采用现代程序设计技术 (5 ...
- vue监听video标签播放暂停,中间按钮替换 controls控制台
先搞个原生的video标签进来 <video ref="movie" class="video" src="static/movie.mp4&q ...
- web server 接口调用
1. 生成客户端代码 2.调用接口 import javax.xml.ws.Service;public static NotificationServiceDevImplPortType mokaA ...
- 进程间通信测试-signal
截图 代码 #include <stdio.h> #include <unistd.h> #include <signal.h> #include <stri ...
- python菜鸟学习: 4.购物车演练
# -*- coding: utf-8 -*-'''1.启动程序后让用户输入消费额,然后打印商品列表'2.允许用户根据商品编码购买商品3.用户选择商品后,检测余额是否够,够则直接扣款,不够就提醒4.可 ...
- 【BOOK】数据存储—文件存储(TXT、JSON、CSV)
数据存储 文本文件-TXT.JSON.CSV 关系型数据库-MySQL.SQLite.Oracle.SQL Server.DB2 非关系型数据库-MongoDB.Redis 文件打开 open() ...
- c++实现单链表及常用方法实现
来自https://blog.csdn.net/h294455907/article/details/80223345 这篇博客,做了一点小改动,用一个cpp实现的 #include<iostr ...