关于 用鼠标移动拖放 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标签的伪类选择器? ...
随机推荐
- sqlsugar 更新某列数据 UpdateColumns 与SetColumns 使用区别
第一种方式 UpdateColumns public int updateLogPath(int TeamID, string logoPath) { Team t = new Team(); t.T ...
- 93、springboot 和springcloud版本对比
https://start.spring.io/actuator/info 建议转为json
- C++实现顺序表相关操作
//顺序表#include<iostream>#include<cstdlib>//C中stdlib.h动态分配内存using namespace std;#define OK ...
- Android 隐藏和显示软键盘
1 public static void hideKeyboard(View view){ 2 InputMethodManager imm = (InputMethodManager) view.g ...
- MySQL dump 备份脚本
vim db_all.sh #!/bin/sh logFile=/home/shell/db_backup.log DATE=`date +'%Y%m%d_%H_%M'` cd /home/data ...
- 从URL中获取参数
1.跳转测试页面 获取的url上的参数 <!doctype html> <html lang="en"> <head> < ...
- Unity3D——关于质量的设置
在Unity3D中,你开发一款游戏,可能需要同时发布到不同平台中.比如,对于PC平台,你可能需要引擎打包高质量的材质纹理,光照图信息.而对于Mobile平台,由于CPU上载数据到GPU需要一定宽带,想 ...
- Unity 设计模式-简单工厂模式和其他好用的通用代码块
1. 2.加法操作类 using System.Collections; using System.Collections.Generic; using UnityEngine; //加法操作类 pu ...
- 启动anaconda的报错:There is an instance of anaconda navigator already running error
首先调出控制台(win+r,输入cmd),然后在控制台输入 tasklist | findstr "pythonw" 在显示出pythonw.exe后,找到其后面的pid(数字), ...
- springboot 整合 oss
一.阿里云配置 获取 accessKeyIdaccessSecret 创建桶 bucketName 二.demo 1.oss.config import org.springframework.bea ...