Visual c++ 如何皮肤MFC主菜单

Visual c++ 如何皮肤MFC主菜单,visual-c++,mfc,menu,skinning,Visual C++,Mfc,Menu,Skinning,我在现有的MFC应用程序中得到了一个菜单,它有一个标准的MFC主菜单 但我想改变它的背景颜色,使它看起来更无缝地属于应用程序的其余部分 第一张图片:MFC主菜单。应用程序的皮肤是蓝色的,如工具栏中所示,但菜单仍然是标准的灰色背景色 第二张图片:Spotify的菜单,剥皮以适合其他页面 颜色 我没有发现任何类似的例子。你能告诉我如何做到这一点吗 我想到的方法是: 将CMenu子类化为我自己的SkinnedMenu,但它不是由我们的代码创建的,而是由从CFrameWnd派生的大型机类中的Get

我在现有的MFC应用程序中得到了一个菜单,它有一个标准的MFC主菜单

但我想改变它的背景颜色,使它看起来更无缝地属于应用程序的其余部分

  • 第一张图片:MFC主菜单。应用程序的皮肤是蓝色的,如工具栏中所示,但菜单仍然是标准的灰色背景色

  • 第二张图片:Spotify的菜单,剥皮以适合其他页面 颜色

我没有发现任何类似的例子。你能告诉我如何做到这一点吗

我想到的方法是:

  • 将CMenu子类化为我自己的SkinnedMenu,但它不是由我们的代码创建的,而是由从
    CFrameWnd
    派生的大型机类中的
    GetMenu()
    调用创建的。我在这里唯一能找到的就是它的方法签名,在
    afxwin.h
    中定义,那么我如何使用自己的子类菜单呢

  • 删除整个菜单,并在一行中添加我自己的自定义菜单按钮,使其看起来像一个菜单。也许这就是spotify所做的,因为他们还移除了Windows窗口框架

  • 以某种方式编辑现有的CMenu,但我现在能找到的唯一定制是修改其
    菜单信息。例如,如果我设置
    info.hbrBack=skin.GetSysColorBrush(颜色菜单)
    唯一改变的颜色是下拉菜单的背景,而不是主菜单本身

  • 其他:)


  • 啊,自定义控件的领域。有几种方法可以实现你想要的。首先对控件进行子类化并重写OnPaint(),请记住您必须处理布局。我可以将CMenu子类化。但是它的项目是在资源文件中定义的,菜单本身是从CFrameWnd接收的。我将把这一点补充到问题中。那么我该如何使用子类呢?我使用新的MFC功能包类成功地做到了这一点。我的主框架源自
    CFrameWndEx
    ,它的菜单有一个
    CMFCMenubar
    成员。我通过编写一个派生自框架MFC Visual Manager类的类来实现一个主题。然后,我调整了它,使其颜色与我假装的颜色一致,并执行了
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMyVisualManager))
    ,其中
    CMyVisualManager
    是我的主题类。