Re: вопрос.
От: Кодт Россия  
Дата: 07.03.05 12:21
Оценка:
Здравствуйте, 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>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.