【问题标题】:How do I add a menubar to my WTL dialog window?如何向我的 WTL 对话窗口添加菜单栏?
【发布时间】:2016-05-24 03:58:06
【问题描述】:

我正在尝试将我在资源中创建的菜单栏添加到资源中的对话框中,但我不知道该怎么做。

我在这方面搜索了很多指南,但它们似乎都只适用于

_Module

根据Does ATL/WTL still require the use of a global _Module variable?,这似乎是一个非常古老的遗物

这些指南中的大多数都希望使用这种方法来解决问题:

CMenu menu;
menu.Attach( LoadMenu( _Module.GetResourceInstance(),MAKEINTRESOURCE(<Menubar ID>)));
SetMenu( menu );

但是,考虑到_Module-方式已经过时,我想知道“现代”方式会是什么。

谁能指出我的解决方案?

【问题讨论】:

    标签: c++ atl wtl


    【解决方案1】:

    WinAPI 函数 LoadMenu 的第一个参数是应从中加载菜单的模块的 HINSTANCE。如果您的应用程序资源在可执行文件中(而不是单独的资源 DLL),您可以通过调用 GetModuleHandle(NULL) 来获取其实例:

    menu.Attach(LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(<Menubar ID>)));
    

    在其他情况下,您需要将模块名称传递给函数。

    顺便说一下,加载菜单更简单的方法是:

    CMenu menu;
    menu.LoadMenu(MAKEINTRESOURCE(<ID>));
    

    这是在 atluser.h 中的实现方式:

    BOOL LoadMenu(ATL::_U_STRINGorID menu)
    {
        ATLASSERT(m_hMenu == NULL);
        m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
        return (m_hMenu != NULL) ? TRUE : FALSE;
    }
    

    所以你可以使用ModuleHelper 来代替_Module。它来自atlapp.h:

    inline HINSTANCE GetResourceInstance()
    {
    #if (_ATL_VER >= 0x0700)
        return ATL::_AtlBaseModule.GetResourceInstance();
    #else // !(_ATL_VER >= 0x0700)
        return ATL::_pModule->GetResourceInstance();
    #endif // !(_ATL_VER >= 0x0700)
    }
    

    ATL::_AtlBaseModule.GetResourceInstance 函数返回编译 ATL 的模块的句柄(如果我没记错的话)。

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2016-03-11
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2023-03-24
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多