1

我试图ToolStripSplitButton使用覆盖来更改 a 的背景,但是通过这样做,当鼠标悬停在按钮上时,下拉菜单上的箭头会消失。

代码:

protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e)
{
    if (!e.Item.Selected)
    {
        base.OnRenderSplitButtonBackground(e);
    }
    else
    {
        Rectangle button = new Rectangle(0, 0, e.Item.Size.Width - 12, e.Item.Size.Height - 1);
        e.Graphics.FillRectangle(Brushes.White, button);
        e.Graphics.DrawRectangle(Pens.Olive, button);

        Rectangle dropdown = new Rectangle(e.ToolStrip.Items[0].Size.Width - 1, 0, e.Item.Size.Width - 32, e.Item.Size.Height - 1);
        e.Graphics.FillRectangle(Brushes.White, dropdown);
        e.Graphics.DrawRectangle(Pens.Olive, dropdown);
    }
}

结果如下所示:

ToolStripSplitButton

我知道它OnRenderArrow存在,我也试图覆盖它,但它看起来dropdownOnRenderSplitButtonBackground.

我应该如何解决这个问题?提前致谢!

4

1 回答 1

1

如果将e.Item属性返回的基类(ToolStripItem)转换为ToolStripSplitButton类,您将获得所有相关属性来绘制拆分按钮的不同部分。

边界属性,例如ButtonBoundsDropDownButtonBoundsSplitterBounds。国家财产;ButtonPressedButtonSelectedDropDownButtonPressed等。

至于箭头部分。您需要调用该OnRenderArrow方法。

例子

protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e)
{
    if (!e.Item.Selected || e.Item.Pressed)
        base.OnRenderSplitButtonBackground(e);
    else
    {
        var sb = e.Item as ToolStripSplitButton;
        var button = sb.ButtonBounds;
        var dropdown = sb.DropDownButtonBounds;

        button.Width--;
        button.Height--;
        dropdown.Width--;
        dropdown.Height--;

        var br = sb.ButtonPressed ? Brushes.Gainsboro : Brushes.White;

        e.Graphics.FillRectangle(br, button);
        e.Graphics.DrawRectangle(Pens.Olive, button);
        e.Graphics.FillRectangle(Brushes.White, dropdown);
        e.Graphics.DrawRectangle(Pens.Olive, dropdown);

        OnRenderArrow(new ToolStripArrowRenderEventArgs(
            e.Graphics, e.Item, sb.DropDownButtonBounds, e.Item.ForeColor,
            ArrowDirection.Down));
    }
}

SOQ65328100

于 2020-12-16T20:30:37.110 回答