здравствуйте. неуверен что мне сюда, но я тут недавно? так что сильно не пеняйте))
у меня есть код типа такого:
//header CMyDlg
class CMyDlg:public CDialog
{
бла-бла-бла;
};
//header CDirectWnd
typedef list<CMyDlg*> TMyDlgList;
typedef TMyDlgList::iterator TMyDlgIt;
#include "mydlg.h"
class CDirectWnd
{
TMyDlgList m_Obj;
void OnBtn()
};
//implementation of CDirectWnd
CDirectWnd::OnBtn()
{
CMyDlg *p=new CMyDlg;
p->Create(IDD_MY_DLG);
m_Obj.push_back(p);
for(TMyDlgIt it=m_Obj.begin();it!=m_Obj.end();it++)
{
(*it)->ShowWindow(SW_SHOW);
}
}
вопрос:
диалоговое окно имеет кнопку закрыть. при нажатии на нее окно должно удалятся из памяти и из списка объектов.
можн это как-то сделать?
предположительно CMyDlg ничего не знает о CDirectWnd
может можно как-то проверить сущствует ли объект в списке list?
09.03.05 06:01: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Здравствуйте, 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>