我的Windows窗体应用程序有一个MenuStrip
,一些菜单项(ToolStripMenuItem
)有一个图标(设置ToolStripMenuItem.Image
属性)。
当RenderMode
的{{1}}属性设置为MenuStrip
时,如果ToolStripRenderMode.System
或Checked
属性为true,则不会显示复选标记,菜单项有一个图标。
当我将CheckOnClick
属性切换为MenuStrip.RenderMode
或ToolStripRenderMode.Professional
时,会显示。
不幸的是,这是一个问题,因为我的应用需要:
ToolStripRenderMode.RenderManagerMode
,因此需要ProgressBar
才能使其生效。Application.EnableVisualStyles()
的呼叫并在MenuStrip上保留默认的Application.EnableVisualStyles()
来完成。但后来我无法获得我的大帐篷ProgressBar!ToolStripRenderMode.RenderManagerMode
设置为RenderMode
可以解决外观要求,但却无法使用图标检查菜单项。有没有办法满足我的所有要求?我错过了什么吗?谢谢你的期待。
答案 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方法的人。