2009-12-11 2 views
1

나는 포인터를 할당하고, comboboxex 컨트롤의 LPARAM 데이터에 저장하고, 해당 컨트롤이 파괴되었을 때 해당 컨트롤을 삭제할 책임을지게하는 데 관심이 있습니다.MFC 사용자 지정 컨트롤 클래스에서 컨트롤 닫기 후크하는 방법

MFC에서 작업 중이므로 CComboBoxEx를 서브 클래스로 만들고 메시지 처리기 또는 가상 멤버 함수를 추가 할 수 있습니다.

질문 :이 패턴은 Win32/MFC에서 가능합니까?

기본적으로 컨트롤은 해당 HWND가 파괴되고 있다는 알림을 어떻게 받습니까?

WM_DESTROY에 대한 문서

:

윈도우가 파괴 될 때 WM_DESTROY 메시지가 전송됩니다. 창문이 화면에서 제거 된 후에 창문이 파괴되는 창문 절차로 보내집니다. . (강조 광산)

불행하게도, 내 막연한 기억은이들의 OnDestroy()가없고, 관련 HWND와 상호 작용이 필요합니다 아무것도 처리하기 위해 너무 늦기 것을 의미인가?

OnDestroy() 중에 comboboxex의 요소를 쿼리 할 수 ​​있습니까? "내 창/컨트롤이 파괴되기 직전에!"대신 사용할 수있는 또 다른 후크가 있습니까?

내 서브 클래스에 대해 CBEM_DELETEITEM을 오버로드하고 LPARAM 데이터를 삭제해야하는지 궁금합니다. 콤보 박스가 파괴되면 모든 항목이 명시 적으로 삭제됩니까? 그렇다면 그 메시지를 통해 모두 파괴 되었습니까? (컨트롤이 그 메시지를 자신에게 보냈습니까?)

+0

참고 : 나는 shared_ptr 또는 scoped_ptr 벡터를 대화 상자 자체에 저장할 수 있음을 알고 있습니다.이 경우 포인터 삭제가 보장됩니다. 그러나이 추가 공간에서 추가 및 삭제를 동기화합니다. – Mordachai

답변

2

OnDestroy() 중에는 여전히 유효합니다. 그렇지 않은 경우 창이 표시되지 않습니다. 메시지는 표준 Windows 메시징 시스템을 통해 전송되기 때문에 메시지가 전혀 표시되지 않습니다.

올바른 방향입니다.이 시나리오는 OnDestroy()와 같습니다. MSDN에서

+0

그래, 윈도우가 화면에서 제거 되었기 때문에 (Mordachai가 WM_DESTROY로 강조한 것처럼) HWND가 더 이상 유효하지 않다는 것을 의미하지는 않습니다. –

+0

고마워요. 실제로, WM_DESTROY를 후킹하는 것은 실제로 잘 작동합니다. – Mordachai

2

:

들의 OnDestroy이 혼잡 윈도우가 파괴에 대한 첫 번째 호출은 다음하여 CWnd의 자식 창에 대한 그들은 파괴한다. OnDestroy가 실행되는 동안 모든 하위 창이 여전히 존재한다고 가정 할 수 있습니다.

관련 문제