MFC对话框属性表在VS 2017中使用会出现错误,但在VS 2013上可以正常运行

3

我有一个现有的Visual Studio 2017 MFC对话框应用程序项目,其中的控件变得太密集和复杂,以至于无法添加更多功能。

我想使用选项卡式对话框界面来分组和简化控件布局。找到了一些有用的文章,详细介绍了为Visual Studio 2015编写的属性页和表的用法。

创建了所需的属性页资源来开始两个选项卡,并在我的Aps的.cpp文件中创建了样式表。编译正常,但在尝试创建对话框时产生运行时异常:

未处理的异常0x7786C54F在Utlities.exe中:Microsoft C++异常:CResourceException,内存位置0x0040F430。

堆栈窗口对我不是很有帮助。

代码段:

CPropertySheet cSheet;
CConverter convTab; // class for first tab
CYield yieldTab;    // class for second tab
cSheet.AddPage(&convTab);
cSheet.AddPage(&yieldTab);
m_pMainWnd = &cSheet;
INT_PTR nResponse = cSheet.DoModal(); // Exception thrown here

我注意到CPropertyPage类显然被CMFCPropertyPage替换了,因为在VS 2017中不再将CPropertyPage列为父类。我认为它可能与CPropertySheet不兼容。我发现使用CMFCPropertySheet编译无误,但产生相同的错误。所以我手动从CPropertyPage派生出我的属性页,并从CPropertySheet派生表。但是还是出现了同样的错误。
我心血来潮打开一台仍安装有Visual Studio 2013的旧电脑,尝试从CPropertySheetCPropertyPages派生。这个办法很好用。
我不知道为什么VS 2013可以正常工作,而VS 2017不能。不想只为此就将我的2017降级到2015。
有什么建议吗?

1
当您在调试模式下进行操作时会发生什么?仍然崩溃吗?如果您删除其中一个选项卡会发生什么?尝试隔离哪个选项卡是有问题的。 - Andrew Truckle
1
根据此处 https://learn.microsoft.com/en-gb/cpp/mfc/reference/cresourceexception-class,它暗示了找不到资源。您是否进行了清理和完整的重建?您的某个页面是否正在使用在较新的IDE中路径已更改的资源? - Andrew Truckle
1
你还没有展示如何将对话框模板添加到继承自 CPropertyPage 的类中。你只是确认你确实有对话框模板。应该有类似于 page1.Construct(IDD_PAGE1); 的东西。*"调用堆栈窗口"* 也应该显示详细信息。 - Barmak Shemirani
我的结论是,CMFCPropertyPage在VS2017中与CMFCPropertySheet或CPropertySheet不兼容。 - Strap147
对话框模板的类是使用Class Wizard创建的,并从提供的基类选项派生而来。在VS 2013和2015中使用CPropertyPages,在VS 2017中使用CMFCPropertyPage。我创建了类变量,并在上面的代码中使用.AddPage()将它们链接到工作表。 - Strap147
显示剩余3条评论
1个回答

1

我曾经遇到过同样的问题,但最终解决了。我使用的是VS 2017。

我的主要代码:

CMFCPropertySheet sheet;
CWizardPage1 page1; // class derived from MFCPropertyPage
CWizardPage2 page2; // class derived from MFCPropertyPage

sheet.AddPage(&page1);
sheet.AddPage(&page2);

sheet.DoModal();

这会在sheet.DoModal()处抛出相同的CResourceException异常。

我所做的更改是在CWizardPage1构造函数中(以及类似的CWizardPage2)。

导致异常的构造函数:

CWizardPage1::CWizardPage1()
{
}

不会引发异常的构造函数:

CWizardPage1::CWizardPage1()
    : CMFCPropertyPage(IDD_WIZARD_PAGE1)
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接