2009-12-11 2 views
1

Я заинтересован в выделении указателей, хранении данных в данных LPARAM элемента управления comboboxex и создании этого элемента управления, ответственного за удаление этих указателей при его уничтожении.Как подключить управление закрытием в классе пользовательского контроля MFC

Поскольку я работаю в MFC, я могу подклассифицировать CComboBoxEx и добавлять либо обработчик сообщений, либо функцию виртуального члена.

Вопрос в следующем: возможна ли эта модель с помощью Win32/MFC?

В принципе, как элемент управления получает уведомление о том, что его соответствующий HWND уничтожается?

Документация WM_DESTROY:

Сообщение WM_DESTROY посылается, когда окно уничтожается. Он отправляется в оконную процедуру разрушаемого окна после удаления окна с экрана. (курсив мой)

К сожалению, мое смутное воспоминание, что это означает, что OnDestroy() слишком поздно что-либо, что требует взаимодействующего с соответствующей HWND обработки, нет?

Можно ли запросить элементы в comboboxex во время OnDestroy()? Есть ли еще один крючок, который я могу использовать, это происходит «Как раз перед тем, как мое окно/элемент управления будет уничтожен (а не после!)?»

Интересно, изменил ли я CBEM_DELETEITEM мой подкласс и заставил его удалить данные LPARAM. Все элементы явно удалены при уничтожении comboboxex? Если это так, все ли они уничтожены через это сообщение (управляет ли это послание для себя?)

+0

Обратите внимание: я знаю, что у меня может быть вектор shared_ptr или scoped_ptr, который хранится в самом диалоге, и в этом случае удаление указателей гарантировано. Однако, чтобы сделать это, я синхронизирую добавления и удаления в этом дополнительном пространстве. – Mordachai

ответ

2

Во время OnDestroy() ваше окно будет по-прежнему действительным - если бы оно не было, ваше окно не получило бы сообщение вообще, поскольку оно отправляется через стандартную систему обмена сообщениями Windows.

Вы на правильном пути - это тип сценария, для которого предназначен OnDestroy().

+0

Yup, только потому, что окно удалено с экрана (как подчеркивает Мордачай в случае с WM_DESTROY), не означает, что HWND больше недействителен. –

+0

Спасибо. Действительно, подключение WM_DESTROY действительно отлично работает. – Mordachai

2

От MSDN:

OnDestroy называется первым для CWnd разрушения, то для дочерних окон CWnd, как они будут уничтожены. Можно предположить, что все дочерние окна все еще существуют, пока работает OnDestroy.

Смежные вопросы