TabRenderer без включенных визуальных стилей? - PullRequest
6 голосов
/ 05 апреля 2010

Я хочу нарисовать пользовательский TabControl с пользовательским функционалом.

Для этого я унаследовал класс Panel и переопределил метод OnPaint для рисования с TabRenderer классом.

Проблема в том, что TabRenderer работает только при включенных визуальных стилях (можно проверить с помощью TabRenderer.IsSupported), но что мне делать, если визуальные стили отключены?

В этом случае я подумал об использовании класса ControlPaint для рисования вкладок без визуальных стилей, но у него нет методов рисования, связанных с вкладками. Я хочу, чтобы он в основном вел себя визуально, как обычный TabControl.

Ответы [ 2 ]

5 голосов
/ 09 апреля 2010

Вы должны нарисовать его самостоятельно, потому что для этого не опубликовано API. Надеюсь, это сравнительно легко сделать не визуально.

Вы можете нарисовать границу панели с помощью ControlPaint.DrawBorder3D и использовать для кнопок что-то вроде следующего кода:

int Top = bounds.Top;
int Bottom = bounds.Bottom - 1;
int Sign = 1;

if (tabStrip.EffectiveOrientation == TabOrientation.Bottom)
{
    Top = bounds.Bottom - 1;
    Bottom = bounds.Top;
    Sign = -1;
}

using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight))
{
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign);
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top);
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top);
}

using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight))
{
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign);
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign);
}

using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark))
{
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign);
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom);
}

using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark))
    e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom);
0 голосов
/ 13 апреля 2010

Это ответ "там", но возможно ли, что вы могли бы использовать wpf? Как видно из ответа выше, настраивать элементы управления в winforms очень сложно, так как в WPF каждый элемент управления выглядит безразлично. Это означает, что вы контролируете то, что отображается и как оно выглядит полностью.

...