Моя цель - уничтожить объект CListBox после того, как он потеряет фокус. Я добавил следующий код для родительского объекта:Уничтожение CListBox после LBN_KILLFOCUS приводит к исключению
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++
[email protected]() Unknown
...
ли кто-нибудь представление о том, что является причиной этой аварии, и как его можно избежать?
Похоже на синхронизацию последовательности сообщений по мере их обработки. Вы пробовали ** публиковать ** WM_DESTROY в списке из обработчика фокуса с убийством? – rrirower
Я пробовал 'PostMessage (WM_DESTROY)'. Это не имело никакого эффекта. (Нет аварии, но окно осталось). Но, похоже, это работает, если я делаю 'PostMessage (WM_CLOSE)'. Это ожидаемое поведение? – sietschie
@rrirower: Нельзя публиковать WM_DESTROY самостоятельно. Единственный правильный способ уничтожить окно - это использование функции DestroyWindow. – xMRi