FAQ:WinAPI VCPP:удалить контрол из собственного обработчика

Материал из Весельчак У

Перейти к: навигация, поиск

Нужно удалить контрол (CComboBox) из диалога. Причём это надо сделать из обработчика сообщения этого контрола.

Вот так вылетает ошибка:

void CMyDialog::OnSelchange()
{
CComboBox* m_pControl = (CComboBox*)GetDlgItem(IDC_MYCOMBO);
m_pControl->DestroyWindow();
}

Удалять объект из принадлежащего ему обработчика нельзя. Нужно удалить объект после завершения обработчика. Например, можно послать в диалог-родитель некое сообщение, в обработчике которого и удалить контрол.

Например:

enum
{
e_command_delete = WM_USER + 1,
};
 
void CMyDialog::OnSelchange()
{
// кладём в очередь сообщений своё сообщение
PostMessage(WM_COMMAND, (e_command_delete << 16) | IDC_MYCOMBO, 0x5555);
}
 
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
if ((wParam >> 16) == e_command_delete)
{
if (((WORD)wParam) == IDC_MYCOMBO)
{
CComboBox* m_pControl = (CComboBox*)GetDlgItem(IDC_MYCOMBO);
m_pControl->DestroyWindow();
return 1;
}
}
 
return CDialog::OnCommand(wParam, lParam);
}