2012-01-13 82 views
1

我喜欢编写一个无模式对话框的应用程序,但我有一个问题。程序启动时,窗口立即关闭。MFC无模式对话框立即关闭

当我进行模态对话时,相同的代码工作正常。 (DoModal()

Csetkliens.h

#pragma once 

#ifndef __AFXWIN_H__ 
    #error "include 'stdafx.h' before including this file for PCH" 
#endif 

#include "resource.h"  // main symbols 
#include "CsetkliensDlg.h" 

class CCsetkliensApp : public CWinApp 
{ 
public: 
    CCsetkliensApp(); 
    virtual BOOL InitInstance(); 
    DECLARE_MESSAGE_MAP() 

private: 
    CCsetkliensDlg* dlg; 
}; 

extern CCsetkliensApp theApp; 

Csetkliens.cpp

#include "stdafx.h" 
#include "Csetkliens.h" 
#include "CsetkliensDlg.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

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

CCsetkliensApp::CCsetkliensApp() 
{ 
    dlg = NULL; 
} 

CCsetkliensApp theApp; 

BOOL CCsetkliensApp::InitInstance() 
{ 
    INITCOMMONCONTROLSEX InitCtrls; 
    InitCtrls.dwSize = sizeof(InitCtrls); 
    InitCtrls.dwICC = ICC_WIN95_CLASSES; 
    InitCommonControlsEx(&InitCtrls); 

    CWinApp::InitInstance(); 

    if (!AfxSocketInit()) 
    { 
     AfxMessageBox(IDP_SOCKETS_INIT_FAILED); 
     return FALSE; 
    } 

    CShellManager *pShellManager = new CShellManager; 

    dlg = new CCsetkliensDlg(); 
    m_pMainWnd = dlg; 
    dlg->Create(CCsetkliensDlg::IDD); 
    dlg->ShowWindow(SW_SHOW); 


    if (pShellManager != NULL) 
    { 
     delete pShellManager; 
    } 

    return FALSE; 
} 

CsetkliensDlg.h

#pragma once 
#include "ConnectDlg.h" 

class CCsetkliensDlg : public CDialogEx 
{ 

public: 
    CCsetkliensDlg(CWnd* pParent = NULL); 
    enum { IDD = IDD_CSETKLIENS_DIALOG }; 
protected: 
    virtual BOOL OnInitDialog(); 
    DECLARE_MESSAGE_MAP() 
}; 

CsetkliensDlg.cpp

#include "stdafx.h" 
#include "Csetkliens.h" 
#include "CsetkliensDlg.h" 
#include "afxdialogex.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

CCsetkliensDlg::CCsetkliensDlg(CWnd* pParent /*=NULL*/) 
    : CDialogEx(CCsetkliensDlg::IDD, pParent) 
{ 
} 

BEGIN_MESSAGE_MAP(CCsetkliensDlg, CDialogEx) 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
END_MESSAGE_MAP() 

BOOL CCsetkliensDlg::OnInitDialog() 
{ 
    CDialogEx::OnInitDialog(); 
    return TRUE; 
} 
+0

我有这个相同的问题,我甚至返回'真'!我的问题是,Visual Studio有我的默认代码,使我的'dlg'成为堆栈中的一个本地变量,而不是堆中的类成员。当'InitInstance'函数退出时,'dlg'的栈实例被解除分配,并且我收到警告,说m_pMainWnd成员被设置为NULL,从而导致应用程序终止。 – 2017-06-13 18:30:06

回答

1

从应用程序类的InitInstance method返回FALSE告诉MFC初始化失败,应用程序应该终止。

更改喜欢return TRUE;和一切应该正常工作。

BOOL CCsetkliensApp::InitInstance() 
{ 
    INITCOMMONCONTROLSEX InitCtrls; 
    InitCtrls.dwSize = sizeof(InitCtrls); 
    InitCtrls.dwICC = ICC_WIN95_CLASSES; 
    InitCommonControlsEx(&InitCtrls); 

    CWinApp::InitInstance(); 

    if (!AfxSocketInit()) 
    { 
     AfxMessageBox(IDP_SOCKETS_INIT_FAILED); 
     return FALSE; 
    } 

    CShellManager *pShellManager = new CShellManager; 

    dlg = new CCsetkliensDlg(); 
    m_pMainWnd = dlg; 
    dlg->Create(CCsetkliensDlg::IDD); 
    dlg->ShowWindow(SW_SHOW); // this is not a blocking call! 


    if (pShellManager != NULL) 
    { 
     delete pShellManager; 
    } 

    return TRUE; // change this one! 
} 

它的工作原理与模态对话框(通过调用DoModal方法所示)的原因是因为一个模态对话框创建自己的消息循环,它运行,直到关闭对话框。这意味着执行在DoModal调用时有效“阻止”,而不会将控制权返回给InitInstance方法,因此它不会返回FALSE并且MFC不会退出。至少直到你关闭对话框,在这种情况下你想让它退出,所以一切都显现出来了。

+0

这解决了我的问题。谢谢。 – 2012-01-13 16:52:52

1

,我没有看到任何东西,告诉应用程序中打开模式窗口,之后维持生命。您至少需要一个“模式”样式窗口或其他控制终止应用程序的内容。

+1

不需要。需要的是一个消息循环,它将消息发送到窗口,不管它们是否是模态的。 – 2012-01-13 17:02:19