c++ - 尝试创建属性表时 mfc 断言失败

标签 c++ mfc assertions

每当我尝试创建属性表时,我都会收到“调试断言失败”,这是我的第一个,我从“MFC Programming from the ground up”中复制它。

这是属性表类:

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);
    }
};

我在主窗口中声明了 Property Sheet 变量:

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);
 }

是不是漏了什么?程序菜单选项的其余部分都有效,但用于调出属性表的“激活”按钮除外。

最佳答案

看起来您正在错误地使用属性页 page1page2page3Construct 方法.您可能假设在该语句中 Construct("PropDialog1", 0); "PropDialog1"是页面的标题。但是,它是资源模板的名称。请阅读here关于如何使用资源模板。

我建议您使用不同的 Construct 方法重载:

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

使用此重载,您可以将与属性页关联的对话框资源 ID 指定为第一个参数,将页面标题的字符串资源 ID 指定为第二个参数。例如:

page1.Construct(IDD_PROP_PAGE1, IDS_PAGE1_CAPTION);

关于c++ - 尝试创建属性表时 mfc 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19258700/

相关文章:

c++ - C++ 20:左半部分或右半部分是否有子范围?

c++ - 我的 CListCtrl 中的选定项目显示省略号,尽管有足够的空间!

c++ - 我怎么知道一个项目是不是MFC应用程序

javascript - YUI.Test断言在事件回调中不会失败

java - JUnit5 中的 assertAll 与多个断言

c++ - 使用参数包将 lambda 转换为 std::function

c++ - 使用 makefile 在最终可执行文件之前创建库

c++ - 使用 Boost Spirit 解析语法

c++ - Qt 中的 Win32 API

c# - 在 C# 中对同一结果进行多个断言的最佳实践