2014-12-10 4 views
0

MFC에 매우 익숙하며 Visual Studio 2008에서 MFC 응용 프로그램을 만들지 묻는 메시지가 표시됩니다. 두 개의 대화 상자를 만들려고합니다. 첫 번째 실행시 열리고 첫 번째 행에서 확인을 누르면 두 번째 대화 상자가 열립니다. 그러나 DoModal()을 호출하면 첫 번째 대화 상자가 제대로 열리지 만 두 번째 대화 상자는 -1을 반환합니다. 아무도 내가 뭘 잘못하고 있는지 알려주실 수 있습니까? MSDN 문서에 따르면 -1은 "뭔가 잘못되었습니다"입니다. 내가 뭘 잘못하고 있는지 알 수 없었다.MFC DoModal이 -1을 반환하는 이유는 무엇입니까? -1은 무엇을 의미합니까?

// The main file from where the dialogs are launched - Encrypt.cpp 
#include "stdafx.h" 
#include "Encrypt.h" 
#include "MainDialog.h" 
#include "AddlDlg.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

BEGIN_MESSAGE_MAP(CEncryptApp, CWinApp) 
ON_COMMAND(ID_HELP, &CWinApp::OnHelp) 
END_MESSAGE_MAP() 

CEncryptApp::CEncryptApp() 
{ 

} 

CEncryptApp theApp; 

BOOL CEncryptApp::InitInstance() 
{ 
    CWinApp::InitInstance(); 
    AfxEnableControlContainer(); 
    AfxInitRichEdit(); 

    CMainDialog dlg; 
    INT_PTR nResponse = dlg.DoModal(); 

    if (nResponse == IDOK) 
    { 
     CAddlDlg ldg; 
     INT_PTR nResponse = ldg.DoModal(); 

     switch (nResponse) 
     { 
      case -1: 
       AfxMessageBox(_T("-1")); 
       break; 
      case IDABORT: 
       AfxMessageBox(_T("1!")); 
       break; 
      case IDOK: 
       AfxMessageBox(_T("2!")); 
       break; 
      case IDCANCEL: 
       AfxMessageBox(_T("3!")); 
       break; 
      default: 
       AfxMessageBox(nResponse); 
      break; 
     }; 


    } 
    else if (nResponse == IDCANCEL) 
    { 

    } 

return FALSE; 
} 

입니다 주 대화

// Main Dialog 

#include "stdafx.h" 
#include "Encrypt.h" 
#include "MainDialog.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 


IMPLEMENT_DYNAMIC(CMainDialog, CDialog) 

CMainDialog::CMainDialog(CWnd* pParent /*=NULL*/) 
    : CDialog(CMainDialog::IDD, pParent) 
{ 
     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    } 

CMainDialog::~CMainDialog() 
{ 
} 

void CMainDialog::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
} 

BEGIN_MESSAGE_MAP(CMainDialog, CDialog) 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

    BOOL CMainDialog::OnInitDialog() 
    { 
    CDialog::OnInitDialog(); 

    SetIcon(m_hIcon, TRUE);   // Set big icon 
    SetIcon(m_hIcon, FALSE);  // Set small icon 
    return TRUE; // return TRUE unless you set the focus to a control 
} 

void CMainDialog::OnPaint() 
{ 
    if (IsIconic()) 
    { 
     CPaintDC dc(this); // device context for painting 

     SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 

     // Center icon in client rectangle 
     int cxIcon = GetSystemMetrics(SM_CXICON); 
     int cyIcon = GetSystemMetrics(SM_CYICON); 
     CRect rect; 
     GetClientRect(&rect); 
     int x = (rect.Width() - cxIcon + 1)/2; 
     int y = (rect.Height() - cyIcon + 1)/2; 
     dc.DrawIcon(x, y, m_hIcon); 
    } 
    else 
    { 
     CDialog::OnPaint(); 
    } 
} 

HCURSOR CMainDialog::OnQueryDragIcon() 
{ 
    return static_cast<HCURSOR>(m_hIcon); 
} 

// 두 번째 대화

#include "stdafx.h" 
#include "Encrypt.h" 
#include "AddlDlg.h" 

IMPLEMENT_DYNAMIC(CAddlDlg, CDialog) 
CAddlDlg::CAddlDlg(CWnd* pParent /*=NULL*/) 
    : CDialog(CAddlDlg::IDD, pParent) 
{  // Reaches until here 
} 

CAddlDlg::~CAddlDlg() 
{ 
} 

void CAddlDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
} 

BOOL CAddlDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 
    return TRUE; 
} 

BEGIN_MESSAGE_MAP(CAddlDlg, CDialog) 
END_MESSAGE_MAP() 

내가 인쇄 디버그 문을하려고 할 때, 나는 두 번째 대화 만의 OnInitDialog의 생성자에 입력 결코 부르지 않는다. 누군가 나를 도울 수 있습니까?

** UPDATE : **

내가 더 디버깅을 볼 수있는 오류가 :: 기능에 dlgcore.cpp에 라인 (311)에 실제 오류와 CreateDialogIndirect입니다

말한다

: : CreateDialogIndirect()는 창을 만들지 않았고 (예 : 템플릿의 오류로 인해) NULL을 반환합니다.

나는 그게 무슨 뜻인지 모르겠다. 어떤 사람이 나를 설명 할 수 있습니까?

MSDN 사이트에서
+0

디버거를 사용하고 DoModal 호출을 통해 단계별로 수행해야합니다. – rrirower

+0

왜 이것을 다운 그레이드 했습니까? 모든 세부 사항을 담은 진정한 질문이었습니다. – Theguy

+0

나는 투표 한 사람이 아니었다. – rrirower

답변

0

:

반환 값은 -1 함수가 대화 상자를 만들거나 IDABORT 수없는 경우 다른 에러가 발생하면, 출력 창은 GetLastError에서 오류 정보를 포함하는 경우 .

오류 표창장은 여기에서 찾을 수 있습니다 : http://msdn.microsoft.com/en-us/library/619z63f5.aspx

시스템은 작성하고 대화 상자를 실행 할 수 없습니다. 자세한 내용은 제공된 MSDN 링크를 참조하십시오.

대화 상자가 필요로하므로 찾을 수없는 컨트롤이나 DLL이 제대로 등록되지 않았을 수 있습니다.

+0

예. 그리고 그녀는 AfxInitRichEdit()을 이미 가지고 있기 때문에 내 추측은 RichEdit 2.0 컨트롤을 사용하게 될 것입니다. 이 경우 AfxInitRichEdit2()를 사용해보십시오. OLE 컨트롤을 사용하는 경우 InitInstance()에서 AfxEnableControlContainer()를 호출해야합니다. –

+0

@StarPilot이 오류를 더 디버깅하고 dlgcore.cpp의 311 행에 오류가 있음을 알았습니다. 아래의 추가 읽기에서 ":: CreateDialogIndirect()는 창을 만들지 않았습니다 (예 : 템플릿의 오류로 인해) \t *을 반환하고 NULL을 반환합니다." – Theguy

+1

@Surya Humor us here. 내가 할 수있는 일은 대화 상자에서 모든 컨트롤을 삭제하고 대화 상자를 만들 수 있는지 확인하는 것입니다. 그래도 실패하면 대화 상자에 대한 제어가 아닌 것으로 판단됩니다. 성공하면 대화 상자를 제어하기 때문입니다. 이 시점에서 컨트롤을 한 번에 하나씩 (또는 한 번에 하나의 유형으로) 추가합니다.STATICs, EDITs 등) 오류가 반복되고 문제가되는 컨트롤이 발견 될 때까지 기다립니다. –

관련 문제