- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想向 TabControl
的 TabPages
添加一个关闭按钮。我尝试了这段代码,它与从左到右的 TabControl 一起工作正常:
private Point _imageLocation = new Point(13, 5);
private Point _imgHitArea = new Point(13, 2);
this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
tabControl2.DrawItem += TabControl2_DrawItem;
private void TabControl2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
try
{
Image img = new Bitmap(GestionP.Properties.Resources.Close);
Rectangle r = e.Bounds;
r = this.tabControl2.GetTabRect(e.Index);
r.Offset(2, 2);
Brush TitleBrush = new SolidBrush(Color.Black);
Font f = this.Font;
string title = this.tabControl2.TabPages[e.Index].Text;
e.Graphics.DrawString(title, f, TitleBrush, new PointF(r.X, r.Y));
if (tabControl2.SelectedIndex >= 1)
{
e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl2.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y));
}
}
catch (Exception) { }
}
private void tabControl2_MouseClick(object sender, MouseEventArgs e)
{
TabControl tc = (TabControl)sender;
Point p = e.Location;
int _tabWidth = 0;
_tabWidth = this.tabControl2.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
Rectangle r = this.tabControl2.GetTabRect(tc.SelectedIndex);
r.Offset(_tabWidth, _imgHitArea.Y);
r.Width = 16;
r.Height = 16;
if (tabControl2.SelectedIndex >= 1)
{
if (r.Contains(p))
{
TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex];
tc.TabPages.Remove(TabP);
}
}
}
但是当我设置属性 RightToLeftLayout = true
和 RightToLeft = true
它不起作用时,TabPage
标题不会出现并且还有关闭按钮。
那么如何以接受 RightToLeft
属性的方式修复代码?
最佳答案
您可以创建一个函数来将矩形的坐标转换为容器中的 RTL 坐标:
public static Rectangle GetRTLCoordinates(Rectangle container, Rectangle drawRectangle)
{
return new Rectangle(
container.Width - drawRectangle.Width - drawRectangle.X,
drawRectangle.Y,
drawRectangle.Width,
drawRectangle.Height);
}
而在 RTL 模式下绘画时,以这种方式计算坐标:
tabRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, tabRect);
此外,您还应该使用 StringFormat
绘制字符串,并在处于 RTL 模式时将其设置为使用 StringFormatFlags.DirectionRightToLeft
,并使用字符串在转换后的矩形中绘制字符串格式:
e.Graphics.DrawString(this.tabControl2.TabPages[e.Index].Text,
this.Font, Brushes.Black, tabRect, sf);
您可以将所有代码封装在继承TabControl
的CustomTabControl
中。
截图
整个代码可以是:
我想您在某个地方有一个关闭图像,例如 Properties.Default.Close
并将其分配给 this.CloseImage
。这是我使用的图像:
我还设置了 this.tabControl2.Padding = new Point(10, 3);
以提供额外的可用空间来绘制图像。
您也可以简单地添加不关闭第一个选项卡的条件。
Image CloseImage;
private void Form1_Load(object sender, EventArgs e)
{
this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
tabControl2.DrawItem += TabControl2_DrawItem;
tabControl2.MouseClick += tabControl2_MouseClick;
CloseImage = Properties.Resources.Close;
this.tabControl2.Padding = new Point(10, 3);
}
private void TabControl2_DrawItem(object sender,
System.Windows.Forms.DrawItemEventArgs e)
{
try
{
var tabRect = this.tabControl2.GetTabRect(e.Index);
tabRect.Inflate(-2, -2);
var imageRect = new Rectangle(tabRect.Right - CloseImage.Width,
tabRect.Top + (tabRect.Height - CloseImage.Height) / 2,
CloseImage.Width,
CloseImage.Height);
var sf = new StringFormat(StringFormat.GenericDefault);
if (this.tabControl2.RightToLeft == System.Windows.Forms.RightToLeft.Yes &&
this.tabControl2.RightToLeftLayout == true)
{
tabRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, tabRect);
imageRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, imageRect);
sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
}
e.Graphics.DrawString(this.tabControl2.TabPages[e.Index].Text,
this.Font, Brushes.Black, tabRect, sf);
e.Graphics.DrawImage(CloseImage, imageRect.Location);
}
catch (Exception) { }
}
private void tabControl2_MouseClick(object sender, MouseEventArgs e)
{
for (var i = 0; i < this.tabControl2.TabPages.Count; i++)
{
var tabRect = this.tabControl2.GetTabRect(i);
tabRect.Inflate(-2, -2);
var imageRect = new Rectangle(tabRect.Right - CloseImage.Width,
tabRect.Top + (tabRect.Height - CloseImage.Height) / 2,
CloseImage.Width,
CloseImage.Height);
if (imageRect.Contains(e.Location))
{
this.tabControl2.TabPages.RemoveAt(i);
break;
}
}
}
public static Rectangle GetRTLCoordinates(Rectangle container, Rectangle drawRectangle)
{
return new Rectangle(
container.Width - drawRectangle.Width - drawRectangle.X,
drawRectangle.Y,
drawRectangle.Width,
drawRectangle.Height);
}
关于c# - 从右到左 TabControl c# 的 TabPages 的关闭按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34508176/
要在 winform 应用程序中创建一个新选项卡,我在 msdn 中找到了这个: string title = "TabPage " + (tabControl1.TabCount + 1).ToSt
我创建了一个自定义 TabControl 和一个自定义 TabPage,如下所示: 自定义 TabControl 代码: public class MyCustomTabControl : TabCo
vim中是否有任何命令可以用来跳转到一个已经打开的选项卡,其中包含在选项卡中打开的文件。 在所有打开的缓冲区中也有完成的可能性。 例如,您在不同的选项卡中打开了以下文件。 readme.txt pom
我有一个由多个 TabPage 组成的 TabControl。这些 TabPage 之一包含 TreeView,另一个包含 DataGridView。我希望这些控件(和选项卡页)能够在不滚动的情况下将
所有,我想向 WinForm TabPage 添加自定义 RichTextBox。我尝试了下面代码所示的各种方法 TabPage tmpTabPage = new TabPage("Test"); t
在 Visual Studio 2010 的设计模式下工作... 我正在尝试在 tabPage 上获得水平滚动条。根据我在这里和那里阅读的理解,将 tabPage 的 AutoScroll 属性设置为
我想创建 tabpage 作为 userControl。 有什么办法可以解决这个问题吗? 最佳答案 添加一个 TabPage,并向其添加一个 UserControl... TabControl tab
我希望在设计时有一个带有控件的面板,但我想在运行时将此面板添加到我的 TabControl 的所需 tabPage。 我写了这样的东西,没有用:面板没有显示在标签页中。请帮助我。 panel2.Par
我正在尝试根据在选项卡控件上单击的选项卡页自动触发事件。 在我的窗体的设计模式中,当我单击选项卡时,属性框显示 Tabs System.Windows.Forms.TabControl 无论哪个选项卡
这个问题在这里已经有了答案: How can I disable a tab inside a TabControl? (26 个答案) 关闭 6 年前。 如何使 TabControl 中的 Tab
我想让用户通过拖放来重新排列 TabPages 顺序。此外,让用户能够将 TabPages 从一个 TabControl 拖到另一个 TabControl 会很酷。就像在 Firefox 和 Tota
我有一个应用程序在客户帐户上运行测试,以判断他们的服务是否正常工作。在运行测试的过程中,应用程序读取每个测试并检查它是否通过/失败/等等......它在tabPage本身上播放绿色复选标记/红色x作为
我想在我的应用程序上实现一个 MiddleClick-To-Delete 功能,就像大多数选项卡式环境一样: 它只是一个带有 TabControl 的单一表单,它有 2x TabPage:Active
我希望能够在 TabPage 上中键单击选项卡并将其从 TabControl 中删除,但即使启用了 HotTracking,我也不知道该怎么做捕获我中间单击的选项卡。 有办法吗? 最佳答案 您可以在
我有一个带有多个选项卡的窗口窗体。我想要一个“TabPage”类型的数组来保存每个选项卡,我想在声明时初始化它。我已经试过了 TabPage[] tabs = {Tab1, Tab2}; TabPag
TabPage 一直在创建,即使标签页已经存在于我的标签控件中。请考虑下面我的代码: void button1_Click(object sender, EventArgs e) { TabP
我有一个包含 TabControl 的简单表单,其中 TabPages 在运行时添加。我已经让所有这些都按我想要的方式工作几乎,但是当我将表单设置为自动调整大小时,它会忽略计算中的运行时 TabPag
类似于浏览器关闭选项卡的方式,我想知道您是否可以在 TabPage 的标题中添加一个按钮。 它会使用自定义 TabPage 渲染器吗 我可以在选项卡本身上添加一个按钮吗 最佳答案 您可以在此处找到示例
我制作了一个 TabControl 并想使用一些控件(标签、文本框、按钮和组合框下拉菜单)。问题是当我选择一个选项卡时,默认背景颜色与控件曾经所在的窗体的默认背景颜色不同。选项卡和控件的颜色太相似,看
我读了这个话题(Adding buttons to a TabControl Tab in C#)但我不明白为什么我下面的代码只向标签页添加一个按钮。我显然已经调试过 foreach 是否正常工作。
我是一名优秀的程序员,十分优秀!