제품 UI를 VS2010으로 마이그레이션해야합니다. 원래 VC6로 작성된 MFC 앱입니다. 나는 다음과 같은 단계를 수행했습니다 :VC6에서 VS2010으로 MFC 응용 프로그램을 이전했습니다. 이제 CPropertyPage 하위 클래스에 대해 OnInitDialog()가 호출되지 않았습니다.
- 는 VS2010
- 모든 프로젝트 VC6의 MFC libs와에 대한 참조 및 디렉토리
내 문제는 대화 상자 개체 (실제로 그것은 CPropertyPage 개체), OnInitDialog() 다른 메서드가되기 전에 호출되고 있지 않습니다. OnInitDialog()에서 멤버 변수를 설정해야하므로 예외가 발생합니다.
대화 상자 클래스 (CPAGEViewDefRecordFields)는 MFC CPropertyPage 클래스에서 파생 된 자체 CValidatedPropertyPage에서 서브 클래 싱됩니다. OnInitDialog() 가상 메서드는 모든 하위 클래스에 있습니다.
VS2010 버전에서는 포함 된 속성 시트에서 DoModal()이 호출 될 때 CPAGEViewDefRecordFields 클래스의 OnInitDialog() 메서드가 호출되지 않습니다. VC6 버전에서는 호출 중이며 모두 제대로 작동합니다.
VC6에서 WM_INITDIALOG 메시지가 보내지고 AfxDlgProc()에서 처리 된 다음 대화 상자 개체의 OnInitDialog()가 차례로 호출됨을 알 수 있습니다.
VS2010 버전에서 처리되는 첫 번째 메시지는 WM_INITDIALOG가 아닌 WM_NOTIFY입니다.
불행히도 MFC에 대한 사전 경험이 없습니다. VC6 버전과 VS2010 버전 사이에서 MFC의 동작이 변경되었다고 가정합니다. 그러나 나는 이것과 비슷한 그물에 아무것도 찾을 수 없었어요.
제가 놓친 또 다른 마이그레이션 단계가 있습니까? 마이그레이션을 수행 할 때 프로젝트의 리소스에 대해 뭔가를해야합니까?
속성 페이지를 두 번 클릭하면 리소스가 올바른 cpp 파일에 연결되어 있고 IDE에서 CPAGEViewDefRecordFields 클래스의 올바른 파일로 이동한다는 것을 확인했습니다.
여러분 중 누구라도 아이디어가 있다면 매우 감사 할 것입니다.
감사합니다. Chris.
class CPAGEViewDefRecordFields : public CValidatedPropertyPage
{
public:
// Construction
CPAGEViewDefRecordFields(CWnd* pParent,
CXpViewProp* pViewProp,
CFont* pFont = NULL,
UINT nIDCaption = 0,
BOOL bSumOpRequired = TRUE,
BOOL bMinMaxRequired = TRUE,
BOOL bAllRecords = TRUE,
BOOL bShowInitSel = TRUE,
XLong lLimits = 0,
BOOL bSortSelTree = TRUE,
CXpThreshBaseLogProp* pThreshLogProp = NULL);
~CPAGEViewDefRecordFields();
// Dialog Data
//{{AFX_DATA(CPAGEViewDefRecordFields)
enum { IDD = IDD_VIEW_DEF_RECORD_FIELDS };
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CPAGEViewDefRecordFields)
virtual BOOL OnInitDialog();
//}}AFX_VIRTUAL
virtual BOOL OnSetActive();
virtual BOOL OnKillActive();
virtual void OnOK();
protected:
...
// Generated message map functions
//{{AFX_MSG(CPAGEViewDefRecordFields)
afx_msg void OnPbRemove();
afx_msg void OnPbAdd();
afx_msg void OnDblclkAvailableFields(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclkSelectedFields(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
...
UPDATE : 디버깅 후
, 내가 문제라고 생각 무엇을 볼 수 있습니다. 그러나 MFC 프로그래머가 아니기 때문에 나는 그것을 이해하지 못한다.
OnInitDialog()가 속성 시트에 대해 호출되고있는 것을 볼 수 있으며 WM_INITDIALOG가 속성 시트에서 속성 페이지로 전송됩니다. 그러나 WM_INITDIALOG가 아닌 WM_NOTIFY 메시지가 전송되므로 WM_NOTIFY 메시지가 전송됩니다.
스택 추적 지점을 강조 표시했습니다. 이것이 일어나는 이유를 설명해주십시오. 이것은 정상적인 행동입니까 - 앞으로이 문제를 해결해야합니까?
실제로 해결 방법을 찾았습니다. 초기화 된 플래그가있어서 OnInitDialog()가 호출 될 때까지 코드가 실행되지 않습니다. 이것은 최선의 해결책이 아니며, 해킹에 대한 두려움이 있기 때문에 이러한 메시지에 대한 이해는 여전히 높습니다. (나는 당신이 보는 무역으로 MFC 프로그래머가 아니다!)
감사합니다!
[이 기술 노트] (http://msdn.microsoft.com/en-us/library/749htf6k(v= VS.71) .aspx)는 Visual Studio 2003에 적용되는 것으로 표시되어 있지만 그것보다 오래되었습니다 (초기 ** 참고 ** 참고). WM_NOTIFY의 출처와 내용을 이해하는 데 도움이 될 수 있습니다. –
초기화 플래그로 해결 방법은 내가하는 것과 같습니다. 트리보기가 만들어졌지만 대화 상자가 아직 준비되지 않았을 때 트리보기가 알림을 보내는 것처럼 보입니다. 다른 컨트롤이 같은 일을하는 시점을 알 수 없으므로 초기화 된 플래그가 필요합니다. –