C # Winform: как установить базовый цвет для TabControl (не для вкладки) - PullRequest
4 голосов
/ 05 декабря 2009

Кажется, это простой вопрос, но как мне установить цвет фона «элемента управления вкладкой», он, кажется, получен из стандартного цвета темы окна. Можно ли создать черный элемент управления вкладками с белым текстом, написанным на самих вкладках (не на вкладке)?

Помогите, я немного знаком с пользовательскими элементами управления, расширяющими существующие элементы управления, но я не знаю, какие свойства (если они существуют) установить.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2009

http://dotnetrix.co.uk/tabcontrol.htm

private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
TabPage CurrentTab = tabControl1.TabPages[e.Index];
Rectangle ItemRect = tabControl1.GetTabRect(e.Index);
SolidBrush FillBrush = new SolidBrush(Color.Red);
SolidBrush TextBrush = new SolidBrush(Color.White);
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;

//If we are currently painting the Selected TabItem we'll
//change the brush colors and inflate the rectangle.
if (System.Convert.ToBoolean(e.State & DrawItemState.Selected))
{
    FillBrush.Color = Color.White;
    TextBrush.Color = Color.Red;
    ItemRect.Inflate(2, 2);
}

//Set up rotation for left and right aligned tabs
if (tabControl1.Alignment == TabAlignment.Left || tabControl1.Alignment == TabAlignment.Right)
{
    float RotateAngle = 90;
    if (tabControl1.Alignment == TabAlignment.Left)
        RotateAngle = 270;
    PointF cp = new PointF(ItemRect.Left + (ItemRect.Width / 2), ItemRect.Top + (ItemRect.Height / 2));
    e.Graphics.TranslateTransform(cp.X, cp.Y);
    e.Graphics.RotateTransform(RotateAngle);
    ItemRect = new Rectangle(-(ItemRect.Height / 2), -(ItemRect.Width / 2), ItemRect.Height, ItemRect.Width);
}

//Next we'll paint the TabItem with our Fill Brush
e.Graphics.FillRectangle(FillBrush, ItemRect);

//Now draw the text.
e.Graphics.DrawString(CurrentTab.Text, e.Font, TextBrush, (RectangleF)ItemRect, sf);

//Reset any Graphics rotation
e.Graphics.ResetTransform();

//Finally, we should Dispose of our brushes.
FillBrush.Dispose();
TextBrush.Dispose();
}
1 голос
/ 17 декабря 2009

Я использую что-то подобное в производном классе mu TabControl (и он будет делать градиенты тоже):

protected override void OnDrawItem(DrawItemEventArgs e)
{
    // fill in the whole rect
    using (SolidBrush br = new SolidBrush(Theme.FormBackColor))
    {
        e.Graphics.FillRectangle(br, ClientRectangle);
    }

    // draw the tabs
    for (int i = 0; i < TabPages.Count; ++i)
    {
        TabPage tab = TabPages[i];
        // Get the text area of the current tab
        RectangleF tabTextArea = (RectangleF)GetTabRect(i);

        // determine how to draw the tab based on which type of tab it is
        Color tabTopBackColor = GetTopBackColor();
        Color tabBottomBackColor = GetBottomBackColor();
        Color tabTextColor = GetTextColor();

        // draw the background
        using (LinearGradientBrush br = new LinearGradientBrush(tabTextArea, tabTopBackColor, tabBottomBackColor, LinearGradientMode.Vertical))
        {
            e.Graphics.FillRectangle(br, tabTextArea);
        }

        // draw the tab header text
        using (SolidBrush brush = new SolidBrush(tabTextColor))
        {
            e.Graphics.DrawString(tab.Text, Font, brush, CreateTabHeaderTextRect(tabTextArea));
        }
    }
}

private RectangleF CreateTabHeaderTextRect(RectangleF tabTextArea)
{
    tabTextArea.X += 3;
    tabTextArea.Y += 1;

    tabTextArea.Height -= 1;

    return tabTextArea;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...