当RenderMode为“System”时,ToolStripMenuItem无法显示复选标记和图像(图标)?

时间:2009-04-01 14:58:49

标签: c# winforms

我的Windows窗体应用程序有一个MenuStrip,一些菜单项(ToolStripMenuItem)有一个图标(设置ToolStripMenuItem.Image属性)。

RenderMode的{​​{1}}属性设置为MenuStrip时,如果ToolStripRenderMode.SystemChecked属性为true,则不会显示复选标记,菜单项有一个图标。

当我将CheckOnClick属性切换为MenuStrip.RenderModeToolStripRenderMode.Professional时,显示。

不幸的是,这是一个问题,因为我的应用需要:

  1. 在选取框模式下ToolStripRenderMode.RenderManagerMode,因此需要ProgressBar才能使其生效。
  2. 该应用需要“平坦”的视觉风格,我通过忽略Application.EnableVisualStyles()的呼叫并在MenuStrip上保留默认的Application.EnableVisualStyles()来完成。但后来我无法获得我的大帐篷ProgressBar!
  3. ToolStripRenderMode.RenderManagerMode设置为RenderMode可以解决外观要求,但却无法使用图标检查菜单项。
  4. 有没有办法满足我的所有要求?我错过了什么吗?谢谢你的期待。

2 个答案:

答案 0 :(得分:3)

哇,我难倒了!现在我知道我必须处理一些严肃的代码。

无论如何,答案是:通过创建一个继承自ToolStripRenderer的类来实现您自己的ToolStripSystemRenderer

使用您自己的代码覆盖绘制项目的方法。这是我正在寻找的具体绘制检查项目。它会检查ToolStripMenuItem是否没有图像。

protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
{
    base.OnRenderItemCheck(e);
    if (e.Item.Selected)
    {
        Rectangle rect = new Rectangle(3, 1, 20, 20);
        Rectangle rect2 = new Rectangle(4, 2, 18, 18);
        SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197));
        SolidBrush b2 = new SolidBrush(Color.Orange);

        e.Graphics.FillRectangle(b, rect);
        e.Graphics.FillRectangle(b2, rect2);
        e.Graphics.DrawImage(e.Image, new Point(5, 3));
    }
    else
    {
        Rectangle rect = new Rectangle(3, 1, 20, 20);
        Rectangle rect2 = new Rectangle(4, 2, 18, 18);
        SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197));
        SolidBrush b2 = new SolidBrush(Color.Orange);

        e.Graphics.FillRectangle(b, rect);
        e.Graphics.FillRectangle(b2, rect2);
        e.Graphics.DrawImage(e.Image, new Point(5, 3));
    }
}

答案 1 :(得分:0)

我也遇到了一个更简单的选择:

您可以简单地将菜单项放入ContextMenuStrip,然后将其分配给DropDownButton的 DropDown 属性。

希望这可以帮助那些不喜欢覆盖Paint方法的人。