2012-03-19 169 views
1

我一直在尝试添加一个工具栏到一个对话框,当我调用m_ToolBar.LoadToolBar失败。为什么CToolBar :: LoadToolBar失败?

我创建了一个新的工具栏资源和它的命名IDR_TOOLBAR1,那么我已将此添加到代码

if(!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | 
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | 
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_ToolBar.LoadToolBar(IDR_TOOLBAR1)) 
{ 
    EndDialog(IDCANCEL); 
} 

出于某种原因m_ToolBar.LoadToolBar(IDR_TOOLBAR1)返回false。我在Visual Studio中创建了工具栏资源,所以我认为我的IDR_TOOLBAR1设置正确。

什么可能导致负载失败?

编辑:我不知道这是否是相关的,但我注意到,工具栏的ID的ID相匹配的另一控制

#define IDC_EDIT_EVENTS     213 
#define IDR_TOOLBAR1     213 

是自动生成的资源文件

编辑2:当我试图调试LoadToolBar时,我发现它调用MAKEINTRESOURCE,这似乎是返回坏指针。 MAKEINTRESOURCE只是一堆强制转换,所以我不确定这里有什么问题。

+0

我改变了ID在Resource.h文件到一个未使用的号码,它仍然返回false当我尝试加载它。 作为一个侧面的问题,为什么Visual Studio会生成已被使用的ID?我查看了整个文件,它以前也好几次完成了。 – Marzipan 2012-03-19 16:34:16

+0

IDC_EDIT_EVENTS是一个与资源无关的控件ID。 IDR_TOOLBAR1是两件事情的资源标识符:1)一个工具栏资源,以及2)一个对应的位图。遍历LoadToolBar()的代码并找出它是否无法加载工具栏资源或关联的位图。 – 2012-03-19 16:37:33

+0

我很困惑。我可以从Microsoft服务器加载调试符号,但我无法真正“进入”代码。该代码本身被Microsoft隐藏,只能在程序集中查看。你能告诉我你是如何进入代码的? – Marzipan 2012-03-19 16:55:43

回答

0

MAKEINTRESOURCE将返回看起来是不好的指针,但这是正常的。资源可以是以字符串形式输出的字符串或整数。

此代码偶然被编译为DLL?如果是这样,也许你需要将下面的代码添加到该函数的顶部,以便MFC能够确定从哪个DLL中获取它。

AFX_MANAGE_STATE(AfxGetStaticModuleState());