如何使TabPages可拖动?

2023-11-27

我想让用户通过拖放来重新排列 TabPages 顺序。此外,如果用户能够将 TabPages 从一个 TabControl 拖动到另一个 TabControl,那就太酷了。两种方式都与 Firefox 和 Total Commander 类似。如何实现这一目标?


通过拖放重新排序选项卡页面 - 作者:路德维希·B.
受到启发http://dotnetrix.co.uk/tabcontrol.htm#tip7

        private void tc_MouseDown(object sender, MouseEventArgs e)
        {
            // store clicked tab
            TabControl tc = (TabControl)sender;
            int hover_index = this.getHoverTabIndex(tc);
            if (hover_index >= 0) { tc.Tag = tc.TabPages[hover_index]; }
        }
        private void tc_MouseUp(object sender, MouseEventArgs e)
        {
            // clear stored tab
            TabControl tc = (TabControl)sender;
            tc.Tag = null;
        }
        private void tc_MouseMove(object sender, MouseEventArgs e)
        {           
            // mouse button down? tab was clicked?
            TabControl tc = (TabControl)sender;
            if ((e.Button != MouseButtons.Left) || (tc.Tag == null)) return;
            TabPage clickedTab = (TabPage)tc.Tag;
            int clicked_index = tc.TabPages.IndexOf(clickedTab);

            // start drag n drop
            tc.DoDragDrop(clickedTab, DragDropEffects.All);
        }
        private void tc_DragOver(object sender, DragEventArgs e)
        {
            TabControl tc = (TabControl)sender;

            // a tab is draged?
            if (e.Data.GetData(typeof(TabPage)) == null) return;
            TabPage dragTab = (TabPage)e.Data.GetData(typeof(TabPage));
            int dragTab_index = tc.TabPages.IndexOf(dragTab);

            // hover over a tab?
            int hoverTab_index = this.getHoverTabIndex(tc);
            if (hoverTab_index < 0) { e.Effect = DragDropEffects.None; return; }
            TabPage hoverTab = tc.TabPages[hoverTab_index];
            e.Effect = DragDropEffects.Move;

            // start of drag?
            if (dragTab == hoverTab) return;

            // swap dragTab & hoverTab - avoids toggeling
            Rectangle dragTabRect = tc.GetTabRect(dragTab_index);
            Rectangle hoverTabRect = tc.GetTabRect(hoverTab_index);

            if (dragTabRect.Width < hoverTabRect.Width)
            {
                Point tcLocation = tc.PointToScreen(tc.Location);

                if (dragTab_index < hoverTab_index)
                {
                    if ((e.X - tcLocation.X) > ((hoverTabRect.X + hoverTabRect.Width) - dragTabRect.Width))
                        this.swapTabPages(tc, dragTab, hoverTab);
                }
                else if (dragTab_index > hoverTab_index)
                {
                    if ((e.X - tcLocation.X) < (hoverTabRect.X + dragTabRect.Width))
                        this.swapTabPages(tc, dragTab, hoverTab);
                }
            }
            else this.swapTabPages(tc, dragTab, hoverTab);

            // select new pos of dragTab
            tc.SelectedIndex = tc.TabPages.IndexOf(dragTab);
        }

        private int getHoverTabIndex(TabControl tc)
        {
            for (int i = 0; i < tc.TabPages.Count; i++)
            {
                if (tc.GetTabRect(i).Contains(tc.PointToClient(Cursor.Position)))
                    return i;
            }

            return -1;
        }

        private void swapTabPages(TabControl tc, TabPage src, TabPage dst)
        {
            int index_src = tc.TabPages.IndexOf(src);
            int index_dst = tc.TabPages.IndexOf(dst);
            tc.TabPages[index_dst] = src;
            tc.TabPages[index_src] = dst;
            tc.Refresh();
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使TabPages可拖动? 的相关文章

随机推荐

  • Objective-C 中的非规范化浮点数?

    Stack Overflow 问题 答案的相关性是什么为什么将 0 1f 更改为 0 会使性能降低 10 倍 对于 Objective C 如果有任何相关性 这应该如何改变我的编码习惯 有没有办法在 Mac OS X 上关闭非规范化浮点 看
  • 如何使用 Jest 模拟第三方 React 组件?

    TLDR 模拟从第三方库导入的 React 组件的正确方法是什么 我正在测试一个名为
  • 有没有一种简单的方法来输出按列的 CSV?

    我正在尝试将多个不同长度的数据列表输出到 CSV 文件 每个列表应该是输出 CSV 文件中的一列 有直接的方法吗 如果我将每个列表作为一行输出 我只需循环每个列表并在到达末尾时输出返回 但这种方法在按列工作时不起作用 我想过一次逐项检查所有
  • 与 Google Reader 同步时如何跳过已知条目?

    为了将离线客户端写入 Google Reader 服务 我想知道如何最好地与该服务同步 似乎还没有官方文档 到目前为止我找到的最好的来源是 http code google com p pyrfeed wiki GoogleReaderAP
  • 我想将子数组添加到 php 中的一个数组中[重复]

    这个问题在这里已经有答案了 我有这样的数组 Array 0 gt Array 0 gt rose 1 gt monkey 2 gt donkey 1 gt Array 0 gt daisy 1 gt monkey 2 gt donkey 2
  • 如果用户没有安装 .NET,如何部署 C# 应用程序?

    我有一个 C 程序 我想将其提供给我的用户 但问题是它需要 NET Framework 版本 4 0 这是一个问题 因为它是最近发布的 2010 年 4 月 很多人可能还没有它 更糟糕的是 下载和安装框架需要一段时间 约 10 分钟 有什么
  • 在android中上传进度条?

    我使用下面的代码将视频上传到 php 服务器 它工作正常 但是我需要在上传文件时显示进度条 我需要在文件上传和进度条增量之间进行同步 有人提出一些想法吗 HttpURLConnection conn null DataOutputStrea
  • 删除某个类型的所有指针的标准 c++11 方法

    有没有办法用一些 c 11 或最多一个 boost 库来做到这一点 include
  • 如何检查使用了哪个segue

    我有两个 segue 导致相同的结果viewController 有 2 个按钮连接到同一个viewController使用2个segue 在那里面viewController我需要检查点击了哪个按钮 所以实际上我需要检查使用 执行了哪个s
  • 谷歌文档脚本中的“有必要分离元素”错误

    当我尝试将段落从一个文档复制到另一个文档时 出现意外错误 需要分离元件 这是什么意思 我究竟做错了什么 function test copy paragrahps var final final var doc1 get doc final
  • 使用 Google OpenID 进行 Android 身份验证。接下来是什么?

    我不是程序员 但我需要自己做这件事 我需要一些帮助 我这两天一直在寻找解决方案 但没有找到 好的 我正在编写 Android 本机应用程序 我的第一个目标是实现通过Google帐户 已在手机上设置 登录的可能性 所以我使用 AccountM
  • 计算数组中的反转次数

    我正在设计一种算法来执行以下操作 给定数组A 1 n 对于每一个i lt j 找到所有反演对 使得A i gt A j 我正在使用合并排序并将数组 A 复制到数组 B 然后比较这两个数组 但我很难了解如何使用它来查找反转数 任何提示或帮助将
  • 在 pyqt 小部件中实现 pyqtgraph 多处理

    我正在尝试在我用 Python 设计的 GUI 上绘制图像 完整的程序将从相机收集图像数据 然后在 GUI 上显示图像 我已经探索过使用 matplotlib 但它对于我的应用程序来说太慢了 我需要绘图相当快地更新 最好是与我从相机获取的速
  • 如何禁用 Ruby on Rails 应用程序中的所有 form_for 输入字段?

    我正在尝试让我的 Rails 应用程序变得干燥一些 所以我想在我的应用程序中渲染一个表单show查看但是disable所有输入字段 show html erb 最好的方法是什么 谢谢你的帮助 JavaScript 一种方法是使用 JS 来完
  • 有没有办法在多个特征上实现一个特征?

    为什么这不起作用 trait Update fn update mut self trait A trait B impl
  • 如何使用 Google Maps ios SDK 跟踪用户位置并显示行进路径

    我目前正在构建一个ios应用程序 我希望实现一个功能 其中用户的位置显示在Google地图视图上 并且当他们移动折线时显示用户迄今为止走过的路径 这显然需要实时发生 到目前为止 我已经初始化了 Google 地图视图 并且可以使用观察Key
  • URL 不带 .aspx 扩展名

    我注意到很多 ASP Net 站点没有以 aspx 结尾的 URL 一个例子是 https stackoverflow com questions 他们是否创建了一个 Questions 文件夹并将 Default aspx 放入其中 在这
  • 设置 Spring JPA 项目以在 MVC 项目中使用 - 创建 bean 时出错

    我在 eclipse 中开发了一个 Spring JPA 项目 它可以访问存储在 mysql 服务器中的数据 现在我需要将这个项目导入到 Spring MVC 项目中 所以 我在JPA项目的构建路径中配置导出maven依赖项 我将项目添加到
  • 将值从 HTML 传递到 SCSS

    我是 SCSS 的新手 不太确定如何使用它 我已经在 SO 和其他地方寻找解决方案 但找不到 我正在开发一个显示手机列表的应用程序 我通过调用 REST API 获取此列表 以 JSON 形式 所有手机都显示相同类型的信息 例如名称 型号
  • 如何使TabPages可拖动?

    我想让用户通过拖放来重新排列 TabPages 顺序 此外 如果用户能够将 TabPages 从一个 TabControl 拖动到另一个 TabControl 那就太酷了 两种方式都与 Firefox 和 Total Commander 类