Фон трекбара в TabControl

У меня есть элемент управления TrackBar на TabPage внутри TabControl. Фон TrackBar отображается серым, а TabPage - белым. Невозможно установить прозрачность свойства BackColor TrackBar, и я не могу переопределить рисунок, потому что для TrackBar нет свойства DrawMode. Какие варианты у меня есть, чтобы подогнать TrackBar? Почему он не поддерживает визуальные стили?


person Jon Tackabury    schedule 17.03.2009    source источник


Ответы (4)


Возможно, вам стоит взглянуть на проект TransparentTrackBar на CodePlex.

person Phil Price    schedule 17.03.2009
comment
Я надеялся использовать встроенные элементы управления, чтобы уменьшить зависимости. Я не могу понять, почему встроенный элемент управления не поддерживает визуальные стили. - person Jon Tackabury; 17.03.2009

Простой

class MyTransparentTrackBar : TrackBar
{
    protected override void OnCreateControl()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        if (Parent != null)
            BackColor = Parent.BackColor;

        base.OnCreateControl();
    }
}

Я также столкнулся с этим (нужна была трекбар с прозрачным фоном на вкладке, которая будет работать как с включенными, так и с отключенными визуальными стилями). И это сработало для меня.

person Alex from Jitbit    schedule 17.04.2011
comment
Я обнаружил, что редактор визуальных форм начал добавлять код для установки BackColor на Color.Transparent, который давал ошибки во время выполнения. Чтобы обойти это, я добавил следующее public new Color BackColor { get { return base.BackColor; } set { if (value != Color.Transparent) { base.BackColor = value; } } } - person Colin; 13.03.2015

Не мешал бы здесь, но ни одно из приведенных выше предложений не помогло мне. При чем тут прикол были следующие строчки:

private const int WM_DWMCOMPOSITIONCHANGED = 0x031A;
private const int WM_THEMECHANGED = 0x031E;

protected override void OnVisibleChanged(EventArgs e)
{
    Color color = this.BackColor;
    trackBarQuality.BackColor = Color.FromArgb(color.R, color.G, color.B);
}

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_DWMCOMPOSITIONCHANGED || m.Msg == WM_THEMECHANGED)
        OnVisibleChanged(new EventArgs());

    base.WndProc(ref m);
}

Поэтому я в основном убираю альфа-канал из цвета фона. Тем не менее, это еще нужно проверить с Vista и Win 7.

person Shockwaverider    schedule 26.07.2011

Кажется, очевидным решением является установка BackColor TrackBar на System-ControlLightLight.

(Но проблема с очевидным решением вопроса четырехлетней давности заключается в том, что он, вероятно, подразумевает, что я что-то неправильно понял.)

person RenniePet    schedule 19.02.2013