我正在努力阻止 MenuStrip 控制受视觉风格的影响。

所以我创建了带有简单菜单条和禁用视觉样式的简单表单 Main():

// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

产生这种外观(注意灰色边框和背景):

enter image description here

现在我想以这种形式的其他控件受视觉样式影响的方式执行相同的操作(我只想禁用此下拉列表的视觉样式)。

所以一开始我尝试禁用视觉样式 DropDown 每一个的 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();Main() 被调用时,窗体的外观如下(蓝色):

enter image description here

还有什么想法可能会影响此下拉列表的外观吗?
我缺少什么?

谢谢。

有帮助吗?

解决方案

您忽略了 MenuStrip 根本不是本机 Windows 控件,因此不受视觉样式主题的直接影响。所有渲染均由 .NET 代码完成。执行此操作的基类是 ToolStripRenderer,它提供了两个实现:ToolStripProfessionalRenderer 和 ToolStripSystemRenderer。后一种尝试模拟操作系统的外观,您可以通过将 MenuStrip 的 RenderMode 设置为“System”来获得它。在 Windows 7 等更高版本的操作系统上,模拟效果一般,而且完全错误。

如果您想要真正的操作系统外观,请改用 MainMenu。与 MenuStrip 相比,它确实有一些局限性。如果您想更改颜色,那么您可以实现自己的渲染器并修改其颜色表。如图所示 这个答案.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top