2016-02-12 91 views
2

我想在我的資源中添加一個從我的資源中創建的菜單欄,但我無法弄清楚如何操作。如何添加菜單欄到我的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已經過時了,那麼「現代」方式將會是。

任何人都可以指出我的解決方案嗎?

回答

3

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編譯(如果我沒有記錯)模塊句柄。

相關問題