首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行GetParent()时崩溃。关闭无模式对话框

在执行GetParent()时崩溃。关闭无模式对话框
EN

Stack Overflow用户
提问于 2013-06-11 19:09:14
回答 1查看 1.7K关注 0票数 0

我正在创建一个非模式对话框。从主框架窗口的菜单项调用对话框。

MainFrm.h

代码语言:javascript
复制
CModeless* modeless;    
bool modelessDlgOpen;     

MainFrm.cpp

代码语言:javascript
复制
void CMainFrame::OnDatabaseMLdlg()     
{     
    // TODO: Add your command handler code here     
    if (modelessDlgOpen == TRUE)      
        return;     

    modelessDlgOpen = TRUE;     

    modeless = new CModeless(this);     

    //modeless->Create(IDD_MLDLG, GetDesktopWindow());     
    modeless->Create(IDD_MLDLG, this);     
    mbPoll->ShowWindow(SW_SHOW);     
}     

单击菜单项时,将调用OnDatabaseMLdlg()函数,并将出现一个具有资源ID IDD_MLDLG的无模式对话框。

问题是在关闭“无模式”对话框时。

我无法找到正确的方法,有一个干净的关闭/销毁这个非模式对话框。单击右上角的“交叉”按钮后,会生成哪条消息?

我尝试过的当前代码如下。(生成仅与关闭对话框相关的代码)

MLDLG.h

代码语言:javascript
复制
#pragma once     

#define WM_MLDLG_CLOSED (WM_USER + 555)     
// CModeless dialog     

class CModeless : public CDialog     
{     
    DECLARE_DYNAMIC(CModeless)     

public:     
    CModeless(CWnd* pParent = NULL);   // standard constructor     
    virtual ~CModeless();      

// Dialog Data     
    enum { IDD = IDD_MLDLG };      

protected:     
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support      

    DECLARE_MESSAGE_MAP()     
public:     
    virtual BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);     
    afx_msg void OnNcDestroy();     
    virtual void PostNcDestroy();     
    CWnd* mParent;     
    afx_msg void OnBnClickedCancel();     
};     

MLDLG.cpp

代码语言:javascript
复制
void CModeless::OnNcDestroy()     
{     
    CDialog::OnNcDestroy();     

    // TODO: Add your message handler code here     
}     

void CModeless::PostNcDestroy()      
{        
    CDialog::PostNcDestroy();     
    GetParent()->PostMessage(WM_MLDLG_CLOSED,0,0);     // **CRASHES HERE**
    delete this;     
}     

void CModeless::OnBnClickedCancel()     
{     
    // TODO: Add your control notification handler code here     
    //CDialog::OnCancel();     
    DestroyWindow();         
}     

无法理解我做错了什么或者我错过了什么?

如有需要,我可以提供更多细节。

提前谢谢。

编辑-20130612:附加信息:

我的构造函数如下:

代码语言:javascript
复制
CModeless::CModeless(CWnd* pParent /*=NULL*/)    
    : CDialog(CModeless::IDD, pParent)    
{    
    mParent = pParent;    
    if (mParent == NULL)    
    {    
        MessageBox(L"mParent is NULL");   
    }    
    else    
    {    
        MessageBox(L"mParent is not NULL");    
    }    
}    

在这里,我已经验证了mParent不是空的。

EN

回答 1

Stack Overflow用户

发布于 2013-06-11 21:17:20

PostNCDestroy()被调用得很晚,而且MFC窗口的大多数有用状态在此时无效。GetParent()可能返回NULL,这将导致您使用它的方式崩溃。

在调用基类实现之前,尝试将PostMessage调用移动到OnDestroy()

另一种选择是缓存父hWnd并在该hWnd上调用::PostMessage()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17051877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档