在尝试根据按钮点击事件更改标签的颜色时,我遇到了这个页面:
它似乎工作,但我丢失了我的选项卡的所有其他格式,现在我设置DrawMode = OwnerDrawFixed后它们显示为空白。如何设置特定页面的选项卡颜色并仍然显示标签正常?
代码:
private void button3_Click(object sender, EventArgs e)
{
this.TabControlMain.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TabControlMain_DrawItem);
SetTabHeader (tabDownload, System.Drawing.Color.Green);
}
private Dictionary<TabPage, Color> TabColors = new Dictionary<TabPage, Color>();
private void SetTabHeader(TabPage page, Color color)
{
TabColors[page] = color;
tabDownload.Invalidate();
}
private void TabControlMain_DrawItem(object sender, DrawItemEventArgs e)
{
//e.DrawBackground();
using (Brush br = new SolidBrush(TabColors[TabControlMain.TabPages[e.Index]]))
{
e.Graphics.FillRectangle(br, e.Bounds);
SizeF sz = e.Graphics.MeasureString(TabControlMain.TabPages[e.Index].Text, e.Font);
e.Graphics.DrawString(TabControlMain.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width) / 2, e.Bounds.Top + (e.Bounds.Height - sz.Height) / 2 + 1);
Rectangle rect = e.Bounds;
rect.Offset(0, 1);
rect.Inflate(0, -1);
e.Graphics.DrawRectangle(Pens.DarkGray, rect);
e.DrawFocusRectangle();
}
}
下面是截屏
答案 0 :(得分:0)
使您可以绘制自己的自定义标题:
public override void DrawTab( Color foreColor,
Color backColor,
Color highlightColor,
Color shadowColor,
Color borderColor,
bool active,
bool mouseOver,
DockStyle dock,
Graphics graphics,
SizeF tabSize )
{
if( active )
{
Pen p = new Pen( borderColor );
graphics.DrawRectangle( p, 0, 0, tabSize.Width, tabSize.Height );
p.Dispose();
}
else
{
Brush b = Brushes.Peru;
float dif = tabSize.Height / 4.0f;
RectangleF r = new RectangleF( 0.0f, dif,
tabSize.Width, tabSize.Height - dif - dif );
graphics.FillRectangle( b, r );
}
}
答案 1 :(得分:0)
原则上你的代码可以工作,如果不是很好,那么至少就足够了。
但是你需要解决一些简单的问题:
OwnerDrawn
,你需要从一开始就这样做,而不是在按下按钮之后!因此,请从一开始就将事件连接起来,最好放在Property-Event Tab
中,以便将其置于Desgner.cs
所属的文件中。现在绘制Tabs
并显示其标签文本。
Tab
控件无效,不 TabPage
!所以改变
tabDownload.Invalidate();
到
TabControlMain.Invalidate();
为了使示例完整,我只做了这个:
private void Form1_Load(object sender, EventArgs e)
{
foreach (TabPage tp in TabControlMain.TabPages)
TabColors.Add(tp, tp.BackColor);
}
这会将字典中的所有Tab
颜色设置为Pages
的颜色。
FocusRectangle
的代码。首先像这样设置Padding
:
this.TabControlMain.Padding = new System.Drawing.Point(10, 4);
这为我们提供了足够的空间来绘制一个漂亮的FocusRectangle
..
然后更改代码以仅在选定的选项卡上绘制它,可能是这样的:
if (TabControlMain.SelectedIndex == e.Index)
using (Pen pen = new Pen(Color.Gray))
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Rectangle rect = e.Bounds;
rect.Offset(0, 1);
rect.Inflate(-3,-2);
e.Graphics.DrawRectangle(pen, rect);
}
现在看起来像这样:
当然,管理颜色取决于你......