【发布时间】:2009-03-17 02:36:37
【问题描述】:
我在 TabControl 内的 TabPage 上有一个 TrackBar 控件。 TrackBar 的背景被绘制为灰色,而 TabPage 被绘制为白色。无法将 TrackBar 的 BackColor 属性设置为透明,并且无法覆盖绘图,因为 TrackBar 没有 DrawMode 属性。我需要哪些选项才能使 TrackBar 适合?为什么不支持视觉样式?
【问题讨论】:
我在 TabControl 内的 TabPage 上有一个 TrackBar 控件。 TrackBar 的背景被绘制为灰色,而 TabPage 被绘制为白色。无法将 TrackBar 的 BackColor 属性设置为透明,并且无法覆盖绘图,因为 TrackBar 没有 DrawMode 属性。我需要哪些选项才能使 TrackBar 适合?为什么不支持视觉样式?
【问题讨论】:
简单
class MyTransparentTrackBar : TrackBar
{
protected override void OnCreateControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
if (Parent != null)
BackColor = Parent.BackColor;
base.OnCreateControl();
}
}
我也遇到过这个问题(需要在选项卡控件上设置一个透明背景的轨迹栏,它可以在启用和禁用视觉样式的情况下工作)。这对我有用。
【讨论】:
public new Color BackColor { get { return base.BackColor; } set { if (value != Color.Transparent) { base.BackColor = value; } } }
在这里不会干涉,但上述建议都没有对我有用。 诀窍是以下几行:
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 进行测试。
【讨论】:
您可能想查看 CodePlex 上的 TransparentTrackBar 项目。
【讨论】:
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();
}
}
【讨论】:
显而易见的解决方案似乎是将 TrackBar 的 BackColor 设置为 System-ControlLightLight。
(但是对四年前的问题有一个明显解决方案的问题是,它可能暗示我误解了一些东西。)
【讨论】: