Winforms ToolStripSplitButton在其下方显示灰色线条,仅在鼠标悬停在其上时才会显示

时间:2009-07-13 04:54:48

标签: c# winforms toolstrip

我正在试图找出ToolStripSplitButton。目的是在按下ToolStripSplitButton时显示用户控制仪表。但是,无论我尝试什么设置,按钮下方都会显示一条灰线。

ToolStrip本身设置为RenderMode.System,未停靠,ToolStripSplitButton是其中唯一的组件。

可以通过引入自定义的ToolStripRenderer类来删除该行,但这似乎对于在控件下删除这条令人讨厌的深灰色线条而言似乎完全过分了。

我意识到它可能是在黑暗中完全拍摄,因为我没有为这些组件提供其余的大量设置,但我希望有人可以提供有关此控件行为方式的原因。< / p>


我的第二个问题是关于ToolStripSplitButton的行为。是否有任何方法可以避免组件在鼠标悬停在其上之前显示的扁平和无边框外观?我试图给它一个统一的外观以及面板中的其余按钮,只有当鼠标光标放在组件上方时,ToolStripSplitButton才会出现。

以下是截图:

ToolStripSplitButton flawed

任何帮助都非常有用!

2 个答案:

答案 0 :(得分:2)

/// <summary>
/// This class provides custom rendering code for the ToolStrip and ToolStripDropDownButton because the standard windows
/// rendering gave it a very flat look.
/// </summary>
public class CustomToolStripRenderer : ToolStripRenderer {
    ToolStripDropDownButton toolStripDDButton;

    public CustomToolStripRenderer(ToolStripDropDownButton toolStripDropDownButton) : base() {
        toolStripDDButton = toolStripDropDownButton;
    }

    //protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs tsirea) {
    //    // Check if the item is selected or hovered over.
    //    if (tsirea.Item.Selected || tsirea.Item.Pressed) {
    //        LinearGradientBrush brush = new LinearGradientBrush(tsirea.Item.Bounds, Color.DarkBlue, Color.DarkGreen, 90);
    //        tsirea.Graphics.FillRectangle(brush, 0, 0, tsirea.Item.Width, tsirea.Item.Height);
    //    }
    //}

    protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs tsrea) {
        // This event occurs before the OnRenderDropDownButtonBackground event...

        if (toolStripDDButton.Pressed) {
            base.OnRenderToolStripBackground(tsrea);
        }
        else if (toolStripDDButton.Selected) {
            ControlPaint.DrawButton(tsrea.Graphics, tsrea.AffectedBounds, ButtonState.Normal);
        }
        else {
            ControlPaint.DrawButton(tsrea.Graphics, tsrea.AffectedBounds, ButtonState.Normal);
        }
    }

    //protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs tsirea) {
    //    // Happens every time the button is hovered over as well, and upon mouseleave

    //    //ControlPaint.DrawButton(tsirea.Graphics, tsirea.Item.ContentRectangle, ButtonState.Normal);
    //    base.OnRenderDropDownButtonBackground(tsirea);
    //}

    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs tsrea) {
        //This event occurs after the OnRenderDropDownButtonBackground event...
        //Thus it will paint over whatever is already painted in the OnRenderDropDownButtonBackground event.

        //Debug.Println("OnRenderToolStripBorder");
        if (toolStripDDButton.Pressed) {
            // Draw the top and left borders of the component so that it looks like a tab page:
            tsrea.Graphics.DrawLine(SystemPens.ControlDarkDark, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Top, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Bottom);
            tsrea.Graphics.DrawLine(SystemPens.ControlDarkDark, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Top, tsrea.AffectedBounds.Right, tsrea.AffectedBounds.Top);
        }
        base.OnRenderToolStripBorder(tsrea);
    }

}

答案 1 :(得分:1)

对于任何有兴趣的人,我最终都会创建一个自定义的ToolStripRenderer类。在这里,我不得不重写几个方法来获得想要的结果,结果非常好。为了绘制按钮轮廓,我只使用了ControlPaint,对于下拉的选项卡式外观,我使用ControlDarkDark系统颜色绘制了一些线条。不要进入血淋淋的细节,有几个教程已经描述了这一点。现在,从ToolStripDropDownButton获取类似按钮的行为似乎很奇怪,我必须自己进行绘制,但我并不排除某个设置可能与某个地方发生冲突。

如果有人有兴趣,我可以发布代码。