2013-10-08 39 views
0

每当我尝试创建属性表时,我都会收到“调试断言失败”,这是我的第一个,我从“从头开始MFC编程” 。mfc尝试创建属性表时发生断言失败

这里是属性表类:

class CSamplePropSheet : public CPropertySheet 
{ 
    CPropDialog1 page1; //first page 
    CPropDialog2 page2; //second page 
    CPropDialog3 page3; //third page 

public: 
    CSamplePropSheet() : CPropertySheet(){ 
     Construct("Sample Property Sheet", this); 

     page1.Construct("PropDialog1", 0); 
     page2.Construct("PropDialog2", 0); 
     page3.Construct("PropDialog3", 0); 
     AddPage(&page1); 
     AddPage(&page2); 
     AddPage(&page3); 
    } 
}; 

我已在属性表变量在我的主窗口,在这里宣布:

class CMainWin : public CFrameWnd 
{ 
    CSamplePropSheet m_PropSheet; 

public: 
    CMainWin(); 

    afx_msg void OnActivate(); 
    afx_msg void OnExit(); 
    afx_msg void OnHelp(); 

    DECLARE_MESSAGE_MAP() 
}; 

然后,我在这里做的电话:

afx_msg void CMainWin::OnActivate() 
{ 

    m_PropSheet.DoModal(); //activate modal property sheet 

} 

当错误弹出时,它指向这段代码:

int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp) 
{ 
    CString string; 
    if (!string.LoadString(nIDPrompt)) 
    { 
     TRACE(traceAppMsg, 0, "Error: failed to load message box prompt string 0x%04x.\n", 
       nIDPrompt); 
     ASSERT(FALSE); 
    } 
    if (nIDHelp == (UINT)-1) 
     nIDHelp = nIDPrompt; 
    return AfxMessageBox(string, nType, nIDHelp); 
} 

错过了什么?程序菜单选项的其余部分工作,除了激活按钮来调出属性表。

回答

1

它看起来像您正在使用Construct方法的属性页page1,page2page3不正确。您可能认为在此声明中Construct("PropDialog1", 0);“PropDialog1”是页面的标题。但是,它是资源模板的名称。请阅读here关于如何使用资源模板。

我建议你使用一个不同的构建方法重载:

void Construct( 
    UINT nIDTemplate, 
    UINT nIDCaption = 0 
); 

有了这个过载,你可以指定与属性页面作为第一个参数,的字符串资源ID相关联的对话框资源的ID作为第二个参数的页面标题。例如:

page1.Construct(IDD_PROP_PAGE1, IDS_PAGE1_CAPTION); 
+0

我不知道为什么,但出于某种原因,在资源模板名称将不会工作,要么直到我缩短了名字,从“PropDialog1”到“PropD1”,现在该程序的作品。谢谢您的帮助! – Stablecannon