Mfc LBN_KILLFOCUS导致异常后销毁CListBox

Mfc LBN_KILLFOCUS导致异常后销毁CListBox,mfc,Mfc,我的目标是在CListBox对象失去焦点后销毁它。我向父对象添加了以下代码: BEGIN_MESSAGE_MAP(CChildView, CWnd) ON_LBN_KILLFOCUS(IDC_LISTBOX, OnLBKillFocus) END_MESSAGE_MAP() void CChildView::OnLBKillFocus() { listBox->DestroyWindow(); } 我创建的对象如下所示: listBox = new CListBox;

我的目标是在CListBox对象失去焦点后销毁它。我向父对象添加了以下代码:

BEGIN_MESSAGE_MAP(CChildView, CWnd)
    ON_LBN_KILLFOCUS(IDC_LISTBOX, OnLBKillFocus)
END_MESSAGE_MAP()

void CChildView::OnLBKillFocus()
{
    listBox->DestroyWindow();
}
我创建的对象如下所示:

listBox = new CListBox;
listBox->Create(WS_VISIBLE | WS_CHILD, CRect(10, 110, 100, 200), this, 1112);
但是在执行了
OnLBKillFocus
函数之后,我在
DefWindowProc
中得到了一个异常。显然,已经销毁的列表框试图处理
WM_KILLFOCUS
消息并崩溃,因为窗口句柄为
NULL

以下是堆栈跟踪的一部分:

mfc110ud.dll!CWnd::DefWindowProcW(unsigned int nMsg, unsigned int wParam, long lParam) Line 1141    C++
mfc110ud.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2138 C++
mfc110ud.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 290   C++
mfc110ud.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 453    C++
mfc110ud.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int   wParam, long lParam) Line 304  C++
user32.dll!_InternalCallWinProc@20()   Unknown
...

有人知道这次崩溃的原因是什么以及如何避免吗?

将导致破坏的行为与破坏本身分离


收到WM_KILLFOCUS事件后,只需将PostMessage与私人消息(注册窗口消息或WM_APP+n)一起使用,并在收到此消息后销毁窗口。

似乎是处理消息序列的计时问题。您是否尝试过从kill焦点的处理程序将WM\u DESTROY发布到列表框中?我尝试过
PostMessage(WM\u DESTROY)
。那没有任何效果。(没有撞车,但窗户仍然开着)。但是如果我做了
PostMessage(WM\u CLOSE)
,它似乎会起作用。这是预期的行为吗?@rrirower:不允许发布WM_自毁。销毁窗口的唯一正确方法是使用DestroyWindow函数。是否有任何理由不使用
PostMessage(WM_CLOSE)
?到目前为止,它似乎起作用了。有什么不利因素吗?我不确定你认为什么是“正常的儿童控制”。但是这个列表框消失了。当然,我不确定窗帘后面会发生什么,以及这是否会导致以后出现其他问题。我想defin window proc只是在收到WM_CLOSE时调用destroy window。这就是您的解决方案。@sietschie::“默认情况下,函数调用函数来销毁窗口。”