我正在尝试阻止MenuStrip
控件受到视觉样式的影响。
所以我在Main()
中创建了简单的菜单条和禁用的视觉样式的简单表单:
// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
产生这种外观(注意灰色边框和背景):
现在我想以这种形式的其他控件受视觉样式影响的方式做同样的事情(我想仅为此下拉列表禁用视觉样式)。
首先,我尝试为每个DropDown
的{{1}}禁用视觉样式,但它不起作用。然后我尝试禁用整个ToolStripMenuItem
的视觉样式,但这两个都没有用。
以下是我自定义MenuStrip的代码:
MenuStrip
尽管使用了自定义class MPMenuStrip : MenuStrip
{
[DllImportAttribute("uxtheme.dll")]
private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);
protected override void OnHandleCreated(EventArgs e)
{
// first attempt:
foreach (ToolStripMenuItem menuItem in this.Items)
SetWindowTheme(menuItem.DropDown.Handle, "", "");
// second attempt:
SetWindowTheme(this.Handle, "", "");
base.OnHandleCreated(e);
}
}
控件,但在调用MenuStrip
中的Application.EnableVisualStyles();
时,表单的外观如下(蓝色):
有什么想法可能会影响这个下拉列表的外观吗? 我错过了什么?
感谢。
答案 0 :(得分:1)
您缺少MenuStrip根本不是本机Windows控件,因此不会直接受视觉样式主题的影响。所有渲染都是通过.NET代码完成的。执行此操作的基类是ToolStripRenderer,具有两个提供的实现:ToolStripProfessionalRenderer和ToolStripSystemRenderer。后者尝试模拟操作系统外观,通过将MenuStrip的RenderMode设置为“System”来获得它。仿真在Windows 7等后来的操作系统上是如此且严重错误。
如果您想要真正的操作系统外观,请使用MainMenu。与MenuStrip相比,它确实有一些限制。如果要更改颜色,则可以实现自己的渲染器并修改其颜色表。如this answer。
所示