Здравствуйте, zeus_2003, Вы писали:
_>диалоговое окно имеет кнопку закрыть. при нажатии на нее окно должно удалятся из памяти и из списка объектов.
_>можн это как-то сделать?
_>предположительно CMyDlg ничего не знает о CDirectWnd
_>может можно как-то проверить сущствует ли объект в списке list?
1. Точка срабатывания — это или деструктор диалога, или его обработчик OnDestroy (в зависимости от того, хранятся ли в списке просто объекты или же существующие окна).
2. Нужно познакомить объект со своим хранилищем. Можно предельно абстрагировать — например, передавать в диалог указатель на список, или функцию-обработчик, или даже хэндл окна
class CMyDlg : public CDialog
{
// 1
std::list<CMyDlg*> *m_pList;
// 2
void* m_callbackparam;
void (*m_callback)(void* param, CMyDlg* dlg);
// 3
HWND m_owner;
public:
void OnDestroy()
{
// 1
m_pList->erase(m_pList->find(this));
// 2
m_callback(m_callbackparam, this);
// 3
::SendMessage(m_owner, WM_RemoveMeFromList, (WPARAM)0, (LPARAM)this);
}
...
};
class CMyWnd : public CWnd
{
std::list<CMyDlg*> m_list;
void remove_from_list(CMyDlg* dlg) { m_list.erase(m_list.find(dlg)); }
// 1
// 2
static void remove_from_list_thunk(void* pvthis, CMyDlg* dlg)
{
((CMyWnd*)pvthis)->remove_from_list(dlg);
}
// 3
LRESULT OnWmRemoveMeFromList(WPARAM w, LPARAM l)
{
remove_from_list((CMyDlg*)l);
}
};
3. Если нужно просто гарантировать, что объект существует (но окно может быть закрыто) — вместо голых указателей используй shared_ptr<CMyDlg>