1

ToolStripSplitButton を理解しようとしています。目的は、ToolStripSplitButton が押されたときにユーザー コントロール ゲージを表示することです。ただし、どの設定を試しても、ボタンの下に灰色の線が表示されます。

ToolStrip 自体は RenderMode.System に設定され、ドッキングされておらず、ToolStripSplitButton がその中の唯一のコンポーネントです。

カスタムの ToolStripRenderer クラスを導入することでこの行を削除できますが、制御下にあるこの 1 つの迷惑な濃い灰色の行を削除するには、やり過ぎのように思えます。

これらのコンポーネントの無数の設定の残りを提供していないため、暗闇の中での完全なショットである可能性があることは理解していますが、このコントロールがそのように動作する理由について誰かが洞察を提供できることを望んでいました.


2 番目の質問は、ToolStripSplitButton の動作に関するものです。マウスがその上に置かれる前にコンポーネントが表示するフラットでボーダレスな外観を回避する方法はありますか? パネルの残りのボタンと一緒に統一された外観を与えようとしています.ToolStripSplitButtonは、マウスカーソルがコンポーネントの上に置かれたときにのみ発生します。

スクリーンショットは次のとおりです。

ToolStripSplitButton の欠陥

どんな助けでも大歓迎です!

4

2 に答える 2

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

}
于 2009-10-14T23:35:50.383 に答える
1

興味のある方のために説明すると、最終的にカスタム ToolStripRenderer クラスを作成することになりました。ここでは、必要な結果を得るためにいくつかのメソッドをオーバーライドする必要がありましたが、結果はかなりうまくいきました。ボタンのアウトラインを描くには、単純に ControlPaint を使用し、ドロップダウン タブのような外観にするために、ControlDarkDark システム カラーでいくつかの線を描きました。詳細については触れませんが、これについて説明しているチュートリアルがいくつかあります。さて、ToolStripDropDownButton からボタンのような動作を得るために自分で描画を行わなければならないのは奇妙に思えますが、どこかで設定が別の設定と衝突した可能性を排除していません。

誰かが興味を持っている場合は、コードを投稿できます。

于 2009-07-14T05:40:59.030 に答える