c++ - 如何将菜单栏添加到我的 WTL 对话窗口?

标签 c++ atl wtl

我正在尝试将我在我的资源中创建的菜单栏添加到我的资源的对话框中,但我不太清楚如何操作。

我搜索了很多指南,但他们似乎都只适用于

_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 方式已经过时,我想知道“现代”方式是什么。

谁能指出我的解决方案?

最佳答案

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 的模块的句柄(如果我没记错的话)。

关于c++ - 如何将菜单栏添加到我的 WTL 对话窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35372133/

相关文章:

c++ - 为什么*everything* 在 ATL/WTL 中使用模板基类?

c++ - 使用Kinect时如何解决PCL中的OpenNi依赖错误?

c++ - 从 JavaScript 中处理 ATL/ActiveX 事件

c++ - ATL 中的 CImage 类

c++ - 如何在自定义 OleDB 驱动程序中显示浏览按钮

c++ - 我如何使用 WTL::CHyperLink?

c++ - "drawed"这样的UI可以在MFC中完成吗

c++ - Qt:为项目资源中的 .txt 文件打开的 QFile 的空内容

c++ - 指针网格,可在变化的对象数量上保持空间结构C++

c++ - fiber.detach() 之后什么时候执行?