【发布时间】:2018-11-06 14:31:36
【问题描述】:
有一个现有的Visual Studio 2017 MFC 对话框应用程序项目,其中的控件变得过于密集和复杂,无法添加更多功能。
我想使用一个选项卡式对话框界面来分组和简化控件布局。找到了一些有用的文章,详细介绍了为 Visual Studio 2015 编写的属性页和工作表的用法。
为启动两个选项卡创建了所需的属性页资源,并在我的 Aps 的 .cpp 文件中创建了样式表。编译正常,但在尝试创建对话框时会产生运行时异常:
Utlities.exe 中 0x7786C54F 处未处理的异常:Microsoft C++ 异常:内存位置 0x0040F430 处的 CResourceException。
堆栈窗口对我不是很有帮助。
代码段:
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 取代,因为 CPropertyPage 在 VS 2017 中不再列为父类。
我认为它可能与CPropertySheet 不兼容。我发现使用 CMFCPropertySheet 很好,但会产生相同的错误。所以我通过并手动从 CPropertyPage 派生了我的属性页,还从 CPropertySheet 派生了工作表。同样的错误。
一时兴起,我启动了一台仍然加载 Visual Studio 2013 的旧计算机,并通过派生 CPropertySheet 和 CPropertyPages 进行了尝试。效果很好。
不知道为什么 VS 2013 有效,而 VS 2017 无效。不愿意仅仅为此将我 2017 年的安装降级到 2015 年。
有什么想法吗?
【问题讨论】:
-
在调试模式下摩擦它会发生什么?还是崩溃?而且,如果您删除其中一个选项卡会发生什么?看看你能不能找出哪个标签是有问题的。
-
根据此处docs.microsoft.com/en-gb/cpp/mfc/reference/…,这意味着找不到资源。您是否进行了干净且完整的重建?您的某个页面是否正在使用现在在较新的 IDE 中具有与以前不同的路径的资源?
-
在显示任何窗口之前,无论是否使用调试器都会崩溃。完全重建没有帮助。使用 Add->New->Resource->Dialog / IDD_PropPage_Large 创建的 PropertyPage。页面的类是使用资源视图中的 ClassWizard 创建的。完整的应用程序是在 VS 2017 上创建的,而不是从以前的版本导入的。我在我的旧机器上安装了 VS 2015,并从头开始重新创建了基本的框架和资源。代码在 2015 年运行良好,在 VS 2017 中打开我在 VS 2015 中制作的框架,它运行没有错误。从头开始在 VS 2017 中重新创建框架,同样的错误。
-
我认为您应该通过 IDE 支持功能向 Microsoft 提出这个问题。
-
您尚未展示如何将对话框模板添加到
CPropertyPage驱动类。您只是在确认您确实有对话框模板。应该有类似page1.Construct(IDD_PAGE1);“调用堆栈窗口” 的东西也应该显示详细信息。
标签: c++ mfc modal-dialog visual-studio-2017