gpt4 book ai didi

c# - 更改 TabControl 未使用空间的颜色

转载 作者:行者123 更新时间:2023-11-30 20:24:05 26 4
gpt4 key购买 nike

我想更改 TabPage 标题右侧未使用空间的颜色。

我试图覆盖窗口的 OnPaintBackground 方法并且它正在工作,这是我使用的代码:

protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
Rectangle lasttabrect = tabControl1.GetTabRect(tabControl1.TabPages.Count - 1);
RectangleF emptyspacerect = new RectangleF(
lasttabrect.X + lasttabrect.Width + tabControl1.Left,
tabControl1.Top + lasttabrect.Y,
tabControl1.Width - (lasttabrect.X + lasttabrect.Width),
lasttabrect.Height);

Brush b = Brushes.BlueViolet; // the color you want
e.Graphics.FillRectangle(b, emptyspacerect);
}

但是因为我在 TabPages 中添加了一个关闭按钮并且我使用了

`tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed` 

我更改了 tabControl1_DrawItem

上面的代码对我不起作用。

最佳答案

选项卡右侧的透明度由视觉样式渲染器提供。但是,当您设置 DrawMode 属性时, native Windows 控件将禁用它。无法改变这种行为。

最好的方法是完全摆脱它,一般来说它是毫无值(value)的。并完全接管这幅画。您可以通过从 TabControl 派生自己的类并设置 ControlStyles.UserPaint 样式标志来完成某些操作。向您的项目添加一个新类并粘贴如下所示的代码。编译。将工具箱顶部的新控件拖放到窗体上。您可能想要自定义 DrawTab() 方法以获得您想要的外观,您将有很多机会让它看起来像您想要的任何方式。另请注意,您可以覆盖 OnPaintBackground() 以使标签栏看起来像您想要的那样,您不必破解表单的绘画。

using System;
using System.Drawing;
using System.Windows.Forms;

class MyTabControl : TabControl {
public MyTabControl() {
// Take over the painting completely, we want transparency and double-buffering
this.SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);
this.DoubleBuffered = this.ResizeRedraw = true;
}

public override Color BackColor {
// Override TabControl.BackColor, we need transparency
get { return Color.Transparent; }
set { base.BackColor = Color.Transparent; }
}

protected virtual void DrawTabRectangle(Graphics g, int index, Rectangle r) {
if (index == 0) r = new Rectangle(r.Left - 2, r.Top, r.Width + 2, r.Height);
if (index != this.SelectedIndex) r = new Rectangle(r.Left, r.Top + 2, r.Width, r.Height - 2);
Color tabColor;
if (index == this.SelectedIndex) tabColor = Color.FromKnownColor(KnownColor.Window);
else tabColor = Color.FromArgb(0xf0, 0xf0, 0xf0);
using (var br = new SolidBrush(tabColor)) {
g.FillRectangle(br, r);
}
}

protected virtual void DrawTab(Graphics g, int index, Rectangle r) {
r.Inflate(-1, -1);
TextRenderer.DrawText(g, this.TabPages[index].Text, this.Font,
r, Color.FromKnownColor(KnownColor.WindowText),
TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
}

protected override void OnPaint(PaintEventArgs e) {
if (TabCount <= 0) return;
// Draw tabpage area
Rectangle r = ClientRectangle;
var top = this.GetTabRect(0).Bottom;
using (var br = new SolidBrush(Color.FromKnownColor(KnownColor.Window))) {
e.Graphics.FillRectangle(br, new Rectangle(r.Left, top, r.Width, r.Height - top));
}
// Draw tabs
for (int index = 0; index < TabCount; index++) {
r = GetTabRect(index);
DrawTabRectangle(e.Graphics, index, r);
DrawTab(e.Graphics, index, r);
if (index == this.SelectedIndex) {
r.Inflate(-1, -1);
ControlPaint.DrawFocusRectangle(e.Graphics, r);
}
}
}
}

关于c# - 更改 TabControl 未使用空间的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com