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 사이트에서
디버거를 사용하고 DoModal 호출을 통해 단계별로 수행해야합니다. – rrirower
왜 이것을 다운 그레이드 했습니까? 모든 세부 사항을 담은 진정한 질문이었습니다. – Theguy
나는 투표 한 사람이 아니었다. – rrirower