代码之家  ›  专栏  ›  技术社区  ›  Stephen Deken

如何在左侧停靠的菜单上绘制箭头?

  •  0
  • Stephen Deken  · 技术社区  · 17 年前

    我有一张C表格,我把一张左舷停靠在里面。 MenuStrip . 这个 主菜单 包含一些包含子菜单的菜单项和一些有效按钮的菜单项(单击它们会导致发生操作;注意,我意识到这不是一个好的设计)。

    我想让与菜单相关联的菜单项在菜单项上绘制右箭头,就像上下文菜单一样。我已经分类了 ToolStripProfessionalRenderer 可以打电话 OnRenderArrow() 在适当的时间(例如 OnRenderItemText() 但我似乎没有办法确定箭头的正确位置。

    因此,这里有两个相互关联的问题:

    1. 是否有方法强制在顶级菜单项上绘制箭头?
    2. 如果没有,是否有方法确定菜单项上箭头的正确位置,以便 OnRunDARARWORE() 可以手动调用?

    谢谢!

    2 回复  |  直到 17 年前
        1
  •  1
  •   FryHard    17 年前

    为什么不使用system.windows.forms.toolstrip而不是menusstrip?这将允许您内置箭头功能,甚至可以解决您遇到的设计问题。

    如果需要,可以指定ToolStrip项不显示图像,只显示文本。通过这种方式,您几乎可以精确地模拟menustrip的功能,但可以免费获得“下拉箭头”。

        2
  •  0
  •   Stephen Deken    17 年前

    我可以把它拼凑起来作为一个解决方案,但我还是想要一些不那么愚蠢的东西:

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