0

left-docked を配置した C# フォームがありMenuStripます。これMenuStripには、サブメニューを含むいくつかのメニュー項目と、実質的にボタンであるいくつかのメニュー項目が含まれています (それらをクリックすると、アクションが実行されます; nb、これは良いデザインではないことに気付きました)。

コンテキストメニューと同じように、メニューが関連付けられているメニュー項目に右向きの矢印をメニュー項目に描画させたいと思います。私はサブクラスToolStripProfessionalRenderer化し、適切なタイミングで呼び出すことができますOnRenderArrow()(例: withinOnRenderItemText()または類似) が、矢印の正しい位置を特定する方法がないようです。

したがって、相互に関連する 2 つの質問がここにあります。

  1. トップレベルのメニュー項目に矢印を強制的に描画する方法はありますか?
  2. OnRenderArrow()そうでない場合、手動で呼び出すことができるように、メニュー項目の矢印の適切な位置を決定する方法はありますか?

ありがとう!

4

2 に答える 2

1

MenuStrip ではなく System.Windows.Forms.ToolStrip の使用を検討しないのはなぜですか。これにより、矢印機能を組み込むことができ、設計上の問題を解決することさえできます。

必要に応じて、ツールストリップ アイテムに画像を表示せず、テキストのみを表示するように指定できます。このようにして、メニューストリップの機能をほぼ正確に模倣できますが、「ドロップダウン矢印」は自由になります。

于 2008-10-07T15:57:29.220 に答える
0

私は解決策としてこれを一緒にハックすることができましたが、まだそれほど鈍くないものが欲しいです:

protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
    base.OnRenderItemText(e);
    if (e.Item.GetType() == typeof(ToolStripMenuItem))
    {
        ToolStripMenuItem tsmi = (ToolStripMenuItem)e.Item;
        if (tsmi.HasDropDownItems && tsmi.OwnerItem == null)
        {
            Rectangle bounds = tsmi.Bounds;
            bounds.X = bounds.Right - 25;
            bounds.Width = 25;
            bounds.Y = 0;
            ToolStripArrowRenderEventArgs tsarea = new ToolStripArrowRenderEventArgs(
                e.Graphics,
                e.Item,
                bounds,
                e.TextColor,
                ArrowDirection.Right);
            OnRenderArrow(tsarea);
        }
    }
}
于 2008-10-07T15:37:14.783 に答える