【问题标题】:Trackbar Background in a TabControlTabControl 中的轨迹栏背景
【发布时间】:2009-03-17 02:36:37
【问题描述】:

我在 TabControl 内的 TabPage 上有一个 TrackBar 控件。 TrackBar 的背景被绘制为灰色,而 TabPage 被绘制为白色。无法将 TrackBar 的 BackColor 属性设置为透明,并且无法覆盖绘图,因为 TrackBar 没有 DrawMode 属性。我需要哪些选项才能使 TrackBar 适合?为什么不支持视觉样式?

【问题讨论】:

    标签: c# winforms trackbar


    【解决方案1】:

    简单

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

    我也遇到过这个问题(需要在选项卡控件上设置一个透明背景的轨迹栏,它可以在启用和禁用视觉样式的情况下工作)。这对我有用。

    【讨论】:

    • 我发现可视化表单编辑器开始添加代码以将 BackColor 设置为 Color.Transparent,这在运行时出错。为了解决这个问题,我添加了以下public new Color BackColor { get { return base.BackColor; } set { if (value != Color.Transparent) { base.BackColor = value; } } }
    【解决方案2】:

    在这里不会干涉,但上述建议都没有对我有用。 诀窍是以下几行:

    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);
    }
    

    所以我基本上从背景颜色中消除了 alpha 通道。不过,仍然需要使用 Vista 和 Win 7 进行测试。

    【讨论】:

      【解决方案3】:

      您可能想查看 CodePlex 上的 TransparentTrackBar 项目。

      【讨论】:

      • 我希望使用内置控件来降低依赖关系。我不明白为什么内置控件不支持视觉样式。
      【解决方案4】:
      internal class TransparentTrackBar : System.Windows.Forms.TrackBar
      {
          protected override void OnCreateControl()
          {
              VisualStyleRenderer oRenderer = new VisualStyleRenderer(
                VisualStyleElement.Tab.Pane.Normal);
      
              BackColor = oRenderer.GetColor(ColorProperty.FillColorHint);
                  base.OnCreateControl();
          }
      }
      

      【讨论】:

        【解决方案5】:

        显而易见的解决方案似乎是将 TrackBar 的 BackColor 设置为 System-ControlLightLight。

        (但是对四年前的问题有一个明显解决方案的问题是,它可能暗示我误解了一些东西。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          相关资源
          最近更新 更多