C++ 已将MFC应用程序从VC6迁移到VS2010,现在没有为CPropertyPage子类调用OnInitDialog()
我的任务是将我们产品的UI迁移到VS2010。这是一个MFC应用程序,最初是用VC6编写的。我已执行了以下步骤: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
- 使用VS2010转换VC6.dsp
- 修复了由于更严格的VS2010编译器而导致的编译错误
- 删除了对VC6 mfc库和目录的所有项目引用
类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的来源及其包含的内容。您使用初始化标志的解决方法与我所做的相同。创建树视图时,树视图似乎会发送通知,但您的对话框尚未准备就绪。您可能不知道其他控件何时执行相同操作,因此您需要使用初始化标志泽德旗。