我正在创建一个非模式对话框。从主框架窗口的菜单项调用对话框。
MainFrm.h
CModeless* modeless;
bool modelessDlgOpen; MainFrm.cpp
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
#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
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:附加信息:
我的构造函数如下:
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不是空的。
发布于 2013-06-11 21:17:20
PostNCDestroy()被调用得很晚,而且MFC窗口的大多数有用状态在此时无效。GetParent()可能返回NULL,这将导致您使用它的方式崩溃。
在调用基类实现之前,尝试将PostMessage调用移动到OnDestroy()。
另一种选择是缓存父hWnd并在该hWnd上调用::PostMessage();
https://stackoverflow.com/questions/17051877
复制相似问题