Winform Tab增加关闭标签页
Winform的Tab控件,有新增有移除,但是呢,缺了一个标签页上的关闭按钮,这个东西说重要也重要,说不重要也不重要。
这里就说一下怎么添加这玩意。
这玩意需要重绘tab控件,所以我们需要处理DrawItem事件,在DrawItem里面把这个X画出来。这里我们就用英文字母的x来当作关闭按钮,也不加什么鼠标事件之类的,就简简单单的实现一下。
首先我们要重写DrawItem事件,在事件里面
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
//这里我们添加一个新的Padding,来增加x的距离
tabControl1.Padding = new System.Drawing.Point(21, 3);
//这里我们用DrawString来画一个x字符
e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4);
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4);
e.DrawFocusRectangle();
}
我们来简单解释一下这玩意,首先我们用DrawString来画一个x,这个位置我也是抄的,算是一个比较好看的位置。
然后我们再把原来的标题画上去。就是下面的那句DrawString。
最后一句我们画出活动区域来。
这样我们的tab的标签页上就有这个x字符了。
这里有可能会报一个GDI+的错误,我没有搞定,但是这个错误完全不影响后面的处理,所以我就直接try了,目前看没什么影响。
有了这个x,我们还要点击它就关闭标签页,所以我们要重写tab的MouseDown、MouseUp、MouseClick事件之一。
我们这里使用MouseDown事件。因为这个事件目前看用起来最顺手。
for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
{
Rectangle r = tabControl1.GetTabRect(i);
// 获取x所在的位置
Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
if (closeButton.Contains(e.Location))
{
if (MessageBox.Show("确定关闭这个标签页吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
this.tabControl1.TabPages.RemoveAt(i);
break;
}
}
}
每次在Tab上执行MouseDown的时候,我们都要判断其是否点击的是我们的x的位置,由于我们有好多个标签页,所以我们要循环去处理所有的标签页。
首先我们通过Rectangle r = tabControl1.GetTabRect(i);获取到标签页的区域,然后使用Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);获取到x的位置,这里的r.Right - 15, r.Top + 4是我们画x的时候指定的,9, 7是大概的x的大小,这里如果我们希望可以点击的区域大一点,就调整这几个值即可。
最后我们判断一下如果我们鼠标点击的区域在这个区域内,证明我们点击了x了,需要关闭这个tab页,然后就走正常的关闭逻辑即可。
Winform Tab增加关闭标签页的更多相关文章
- 开源 侧滑 和 Tab滑动翻页 控件
侧滑 https://github.com/jfeinstein10/SlidingMenu Tab滑动翻页 https://github.com/astuetz/PagerSlidingTabStr ...
- ViewPagerIndicator 取代TabHost,实现滑动tab,引导页等效果
https://github.com/eltld/ViewPagerIndicator 取代TabHost,实现滑动tab,引导页等效果
- IDEA快捷键之关闭标签页和选定单词
下面所说的快捷键仅作为演示使用,个人可根据喜好自行设置 使用Alt + W 选中某个单词 点击IDEA左上角的File 打开Settings 在左侧点击KeyMap 打开右侧的Editor Actio ...
- 修改IDEA关闭标签页的快捷键
IDEA原先关闭标签页的快捷键是Ctrl + F4 ,操作起来很不方便,而我们通常习惯于用 Ctrl + W 关闭浏览器的标签页,所以,也可以将关闭IDEA标签页的快捷键修改为Ctrl + W,具体步 ...
- 扩展 easyui-tabs 插件 关闭标签页方法
$.extend($.fn.tabs.methods,{ allTabs:function(jq){ var tabs = $(jq).tabs('tabs'); var all = []; all ...
- ecshop后台增加模板页的方法
CShop的动态模板机制是一个非常灵活的系统,管理员可以在后台根据自己的要求调整模板模块的显示位置.本文详细讲解了如何修改ECSHOP内部结构使得用户可以添加自己的模板页从而方便灵活的使用系统自带的模 ...
- Django实战(12):增加目录页,设定统一布局
针对上一节的新需求,界面设计师还为我们设计了一个新的界面,不仅仅是目录页,还包含了站点的整体风格,如下图: 感谢界面设计师为我们提供的“又黑又硬”的工具条,这个看起来真的很酷.下面,让我们来享用她的工 ...
- dedecms 织梦列表页标题增加显示页数
判断是否为第一页,为第一页则不显示页数的代码: {dede:pagelist listsize='0' listitem='pageno' function='html2text(@me)' runp ...
- WinForm下增加声音提示
在WinForm平台下播放声音,一般有两种方式:第一种是调用系统自带声音: [代码] 申明定义: [DllImport("kernel32.dll")] public static ...
- PDF 补丁丁 0.5.0.2731 发布(增加去除页面表单和链接水印功能)
新的版本增加了简单的删除表单和链接批注的功能,使用该功能可去掉某些软件打上的水印. 在 PDF 文档选项中选中“清除页面所有表单”和“清除页面所有链接批注”项后,程序将会删除页面的表单和链接批注. 效 ...
随机推荐
- 04. 寻找两个正序数组的中位数 Golang实现
题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 算法的时间复杂度应该为 O(log (m+n)) . 示例 1: ...
- CPP在内网穿透技术的思考
概述 内网穿透是一种技术,用于在私有局域网(LAN)中的设备与外部网络(如互联网)之间建立通信通道,使得外部设备可以访问内网中的服务.由于内网设备通常位于防火墙或 NAT(网络地址转换)设备之后,外部 ...
- RxJS 系列 – Join Operators
前言 前几篇介绍过了 Creation Operators Filtering Operators Join Creation Operators Error Handling Operators T ...
- Flutter Engage China 开发者常见问题解答 | 下篇
再次感谢大家对 Flutter Engage China 活动 的关注和积极参与!我们在活动前后收到了很多来自开发者的反馈和问题,Flutter 团队和演讲嘉宾在直播 Q&A 环节中也针对部分 ...
- [OI] 欢夏!邪龙?马拉车!
标题来自原神 算法概述 Manacher 算法 用途:寻找回文串,最板子的情况下用于字符串的回文子串计数 给定一个字符串 \(S\),求出它全部的回文子串 容易想到一种暴力的 \(n^{2}\) 做法 ...
- [Tkey] CodeForces 1267G Game Relics
太神了这题,膜拜出题人 orz. 思考一 首先是大家都提到的一点,先抽卡再买.这里来做个数学分析. 假设我们还剩 \(k\) 种没有买,其实我们是有式子来算出它的花费期望的.WIKI 上提到,假设一个 ...
- 【赵渝强老师】什么是Spark SQL?
一.Spark SQL简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用. 为什么要学习Spark SQL? ...
- 【赵渝强老师】Weblogic域和域的组成
一.什么是Weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于Java EE架构的中间件,WebLogic是用于开发.集成.部署和 ...
- CF753B题解
这应该算是一个很脍炙人口的小游戏了吧 (没玩过算我没说) 因为一共有 \(50\) 次询问机会,那最简单直接的方法就不难想到. 我们把 \(0 \sim9\) 全部询问一遍,如果回答两个整数不全为 \ ...
- .Net 反射和特性
学习:.net 反射简单介绍 - WebEnh - 博客园 (cnblogs.com) 反射就是通过反射程序集从而获取相关信息 十月的韩流 使用了特性就必定会使用反射 var res = obj.Ge ...