2011-08-30 7 views
3

제품 UI를 VS2010으로 마이그레이션해야합니다. 원래 VC6로 작성된 MFC 앱입니다. 나는 다음과 같은 단계를 수행했습니다 :VC6에서 VS2010으로 MFC 응용 프로그램을 이전했습니다. 이제 CPropertyPage 하위 클래스에 대해 OnInitDialog()가 호출되지 않았습니다.

  • 는 VS2010
  • 모든 프로젝트 VC6의 MFC libs와에 대한 참조 및 디렉토리
을 고정 제거 엄격한 VS2010 컴파일러
  • 로 인해 컴파일 오류가 사용 .DSP VC6을 변환

    내 문제는 대화 상자 개체 (실제로 그것은 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 프로그래머가 아니다!)

    감사합니다!

    stack trace showing WM messages

  • +0

    [이 기술 노트] (http://msdn.microsoft.com/en-us/library/749htf6k(v= VS.71) .aspx)는 Visual Studio 2003에 적용되는 것으로 표시되어 있지만 그것보다 오래되었습니다 (초기 ** 참고 ** 참고). WM_NOTIFY의 출처와 내용을 이해하는 데 도움이 될 수 있습니다. –

    +0

    초기화 플래그로 해결 방법은 내가하는 것과 같습니다. 트리보기가 만들어졌지만 대화 상자가 아직 준비되지 않았을 때 트리보기가 알림을 보내는 것처럼 보입니다. 다른 컨트롤이 같은 일을하는 시점을 알 수 없으므로 초기화 된 플래그가 필요합니다. –

    답변

    0

    생각해 보겠습니다.

    는 대답은 SO 사용자의 코멘트에서 온 : 초기화 된 플래그

    귀하의 해결 방법은 내가 할 것입니다 동일합니다. 트리보기가 만들어졌지만 대화 상자가 아직 준비되지 않았을 때 트리보기가 알림을 보내는 것처럼 보입니다. 다른 컨트롤이 같은 일을하는 시점을 알 수 없으므로 초기화 플래그가 필요합니다.

    "해결 방법"은 대화 상자가 준비되었음을 보증하는 유일한 방법입니다.

    0

    모든 대화 상자 컨트롤을 생성하고 대화 상자가 표시되기 직전 후에는 OnInitDialog이라고합니다.