MFC无模式对话框立即关闭 [英] MFC modeless dialog close immediately

查看:438
本文介绍了MFC无模式对话框立即关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我喜欢写一个基于非模态对话框的应用程序,但我有一个问题。当程序启动时,窗口立即关闭。

I like to write a modeless dialog based app, but I have a problem. When the program starts, the window close immediately.

当我做一个模态对话框时,同样的代码工作正常。 ( DoModal()

The same code works fine when I make a modal dialog. (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
$ b

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;
}


推荐答案

> FALSE 从您的应用程序类的 InitInstance 方法告诉MFC初始化失败,应用程序应该终止。

Returning FALSE from your application class's InitInstance method tells MFC that initialization failed and the application should terminate.

更改为 return TRUE; ,一切都应该正常工作。

Change that like to return TRUE; and everything should work fine.

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!
}

使用模态对话框的原因c $ c> DoModal 方法)是因为模态对话框创建了自己的消息循环,它运行直到你关闭对话框。这意味着执行在 DoModal 调用时有效地阻塞,而不返回控制到您的 InitInstance 方法, t return FALSE ,并且MFC不退出。至少直到你关闭对话框,在这种情况下你希望它退出,所以一切都出现的工作。

The reason that it works with a modal dialog (shown by calling the DoModal method) is because a modal dialog creates its own message loop, which runs until you close the dialog. That means that execution effectively "blocks" at the DoModal call without returning control to your InitInstance method, so it doesn't return FALSE and MFC doesn't quit. At least not until you close the dialog, in which case you want it to quit, so everything appears the work.

这篇关于MFC无模式对话框立即关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆