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

Материал из Весельчак У
Версия от 22:10, 3 октября 2009; RXL (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Нужно удалить контрол (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);
}