在LBN_KILLFOCUS导致异常后销毁CListBox

时间:2015-07-16 16:36:20

标签: mfc

我的目标是在失去焦点后销毁CListBox-Object。我将以下代码添加到父对象:

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中得到了一个例外。显然已经被破坏的ListBox试图处理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
...

有没有人知道这次事故的原因是什么以及如何避免?

1 个答案:

答案 0 :(得分:2)

解除应该导致破坏和破坏的行为。

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