Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 已将MFC应用程序从VC6迁移到VS2010,现在没有为CPropertyPage子类调用OnInitDialog()_C++_Visual Studio 2010_Visual C++_Mfc_Visual C++ 6 - Fatal编程技术网

C++ 已将MFC应用程序从VC6迁移到VS2010,现在没有为CPropertyPage子类调用OnInitDialog()

C++ 已将MFC应用程序从VC6迁移到VS2010,现在没有为CPropertyPage子类调用OnInitDialog(),c++,visual-studio-2010,visual-c++,mfc,visual-c++-6,C++,Visual Studio 2010,Visual C++,Mfc,Visual C++ 6,我的任务是将我们产品的UI迁移到VS2010。这是一个MFC应用程序,最初是用VC6编写的。我已执行了以下步骤: 使用VS2010转换VC6.dsp 修复了由于更严格的VS2010编译器而导致的编译错误 删除了对VC6 mfc库和目录的所有项目引用 我的问题是,对于dialog对象(实际上是CPropertyPage对象),在调用其他方法之前,不会调用OnInitDialog()。这会导致异常,因为OnInitDialog()需要设置成员变量 对话框类(CPAGEViewDefRecordF

我的任务是将我们产品的UI迁移到VS2010。这是一个MFC应用程序,最初是用VC6编写的。我已执行了以下步骤:

  • 使用VS2010转换VC6.dsp
  • 修复了由于更严格的VS2010编译器而导致的编译错误
  • 删除了对VC6 mfc库和目录的所有项目引用
我的问题是,对于dialog对象(实际上是CPropertyPage对象),在调用其他方法之前,不会调用OnInitDialog()。这会导致异常,因为OnInitDialog()需要设置成员变量

对话框类(CPAGEViewDefRecordFields)是从我们自己的CValidatedPropertyPage派生的子类,而CValidatedPropertyPage又是从MFC CPropertyPage类派生的。所有子类中都存在虚拟方法OnInitDialog()

在VS2010版本中,当对包含的属性表调用DoModal()时,不会调用CPAGEViewDefRecordFields类的OnInitDialog()方法。在VC6版本中,正在调用它,所有工作正常

在VC6中,我可以看到消息WM_INITDIALOG是在AfxDlgProc()中发送和处理的,然后AfxDlgProc()调用dialog对象的OnInitDialog()

在VS2010版本中,处理的第一条消息是WM_NOTIFY,而不是WM_INITDIALOG

不幸的是,我以前没有MFC方面的经验。我假设在VC6版本和VS2010版本之间,MFC的行为发生了一些变化。但是我在网上找不到任何类似的东西

我是否还错过了另一个迁移步骤?在进行迁移时,我应该对项目中的资源做些什么吗

我已经检查了资源是否绑定到正确的cpp文件,因为我可以双击属性页,IDE会将我带到CPAGEViewDefRecordFields类的正确文件

如果你们有什么想法,我将非常感激

谢谢! 克里斯

类CPAGEViewDefRecordFields:公共CValidatedPropertyPage
{
公众:
//建筑
CPAGEViewDefRecordFields(CWnd*pParent,
CXpViewProp*pViewProp,
CFont*pFont=NULL,
UINT=0,
BOOL bSumOpRequired=真,
BOOL bMinMaxRequired=TRUE,
BOOL bAllRecords=TRUE,
BOOL bShowInitSel=TRUE,
XLong lLimits=0,
BOOL bSortSelTree=TRUE,
CXpThreshBaseLogProp*pThreshLogProp=NULL);
~CPAGEViewDefRecordFields();
//对话框数据
//{{AFX_数据(CPAGEViewDefRecordFields)
枚举{IDD=IDD_视图_定义_记录_字段};
//}}AFX_数据
//覆盖
//类向导生成虚拟函数重写
//{{AFX_虚拟(CPAGEViewDefRecordFields)
虚拟BOOL-OnInitDialog();
//}}AFX_虚拟
虚拟BOOL OnSetActive();
虚拟BOOL OnKillActive();
虚拟void OnOK();
受保护的:
... 
//生成的消息映射函数
//{{AFX_MSG(CPAGEViewDefRecordFields)
afx_msg void OnPbRemove();
afx_msg void OnPbAdd();
afx_msg void OnDblclkAvailableFields(NMHDR*pNMHDR,LRESULT*pResult);
afx_msg void onDBLCLKSelected字段(NMHDR*pNMHDR、LRESULT*PRESLT);
//}}AFX_味精
声明消息映射()
私人:
...

更新:

经过一些调试,我可以看到我认为是什么问题。然而,不是一个MFC程序员,我不明白它

我可以看到正在为属性表调用OnInitDialog(),然后将WM_INITDIALOG从属性表发送到属性页。但是,在windows内部的某个点上,正在发送WM_NOTIFY消息,因此这是收到的第一条消息,而不是预期的WM_INITDIALOG

我已经强调了堆栈跟踪上的要点,附件-有人能解释为什么会发生这种情况吗?这是正常的行为吗-我应该在将来考虑这种情况吗

事实上,我已经找到了一个解决办法,那就是设置一个初始化标志,这样在调用OnInitDialog()之前就不会执行任何代码。这不是最好的解决方案,而且我担心这更像是一种黑客行为,所以我仍然希望能够理解这些消息。(你看,我不是MFC程序员!)

谢谢


在创建所有对话框控件之后,在显示对话框之前调用OnInitDialog。

我想我最好回答这个问题

答案来自一位SO用户的评论:


您使用初始化标志的解决方法与我所做的相同。看起来树视图在创建树视图时会发送通知,但您的对话框尚未准备就绪。您可能不知道其他控件何时执行相同操作,因此需要初始化标志


“变通方法”是保证对话框准备就绪的唯一方法。

虽然被标记为适用于Visual Studio 2003,但我认为它比这要古老得多(请参见初始注释)。这可能有助于您了解WM_NOTIFY的来源及其包含的内容。您使用初始化标志的解决方法与我所做的相同。创建树视图时,树视图似乎会发送通知,但您的对话框尚未准备就绪。您可能不知道其他控件何时执行相同操作,因此您需要使用初始化标志泽德旗。