MFC无模式对话框立即关闭

时间:2012-01-13 16:23:21

标签: c++ winapi mfc dialog modeless

我喜欢编写一个基于模式的无模式应用程序,但我遇到了问题。程序启动时,窗口立即关闭。

当我进行模态对话时,相同的代码工作正常。 (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;
}

2 个答案:

答案 0 :(得分:1)

打开无模式窗口后,我没有看到任何告诉应用程序保持活动状态的内容。您至少需要一个“模态”样式窗口或其他东西来控制应用程序的终止。

答案 1 :(得分: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不会退出。至少在关闭对话框之前,在这种情况下你希望它退出,所以一切都显示出来了。