【问题标题】:How can I draw arrows on my left-docked MenuStrip?如何在左侧停靠的 MenuStrip 上绘制箭头?
【发布时间】:2008-10-07 15:07:54
【问题描述】:

我有一个 C# 表单,我在其中放置了一个左侧停靠的 MenuStrip。这个MenuStrip 包含一些包含子菜单的菜单项,以及一些实际上是按钮的菜单项(单击它们会导致发生操作;注意,我意识到这不是一个好的设计)。

我想让具有关联菜单的菜单项在菜单项上绘制向右箭头,就像上下文菜单一样。我已经对ToolStripProfessionalRenderer 进行了子类化,并且可以在适当的时间调用OnRenderArrow()(例如,在OnRenderItemText() 或类似的范围内),但我似乎没有办法确定箭头的正确位置。

所以,这里有两个相互关联的问题:

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

谢谢!

【问题讨论】:

    标签: c# .net winforms menustrip


    【解决方案1】:

    您为什么不考虑使用 System.Windows.Forms.ToolStrip 而不是 MenuStrip。这将允许您内置箭头功能,甚至可以解决您遇到的不良设计问题。

    如果您愿意,您可以指定工具条项目不显示图像而只显示文本。通过这种方式,您几乎可以完全模仿菜单条的功能,但可以免费使用“下拉箭头”。

    【讨论】:

      【解决方案2】:

      我能够将它作为一个解决方案一起破解,但我仍然想要一些不那么迟钝的东西:

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

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多