구현노트
실재 구현은 FlashconAxImpl.h 있습니다. FlashconAxImpl.h 는 WIN32 호환 코드 입니다. 즉 MFC나 ATL/WTL 등등의 플랫폼에 종속되지 않습니다. (ATL.dll 을 사용해야하고 2개의 ATL 헤더파일을 사용하긴 하지만 이 파일들은 ATL 없이도 독립적으로 동작할 수 있있는 파일이라는 관점에서 ATL에 완전히 종속되지 않는다는 의미입니다.) FlashconAxWindow.h 와 FlashconAxWindow.cpp은 MFC 용 FlashconAxImpl.h를 사용하는 MFC를 위한 어댑터 클래스이고 FlashconAxWindow_WTL.h 는 ATL/WTL을 위한 어댑터 클래스 입니다.
신형철님의 강좌에 따라 작성하였는데 아주 조금 변경을 하였습니다. windowless 모드 플래시로 부터 컨테이너로 발생되는 WM_PAINT를 받기 위해서 서브클래싱 순서가 중요한데 이 순서를 잘못 설정해서 처음에는 TIMER를 사용했었다가 나중에서야 제대로 수정했습니다.
ATL.DLL 서비스를 사용하기 때문에 배포 시 반드시 ATL.DLL 을 같이 배포해야합니다만 ATL에 종속되지는 않습니다. 즉 ActiveX 컨트롤 호스팅하기 위해서 사용하는 ATL.dll 파일이 system32 폴더에 있어야 하며 atldef.h, atliface.h 파일을 참조할 수 있어야 컴파일이 가능합니다. VC 설치하면서 ATL 설치했으면 별 문제 없을겁니다 (참고) How to add ATL control containment support to any window in Visual C++ ( http://support.microsoft.com/kb/192560/ ) ).
ATL.dll 에 포함되어 있는 AxWindow는 ActiveX 컨트롤 호스팅을 지원해줍니다. (OCX96 specificatio, windowless activation, flicker-free drawing)
Flash ActiveX를 호스팅하는 AtlAxWin 윈도(CFlashconAxWindow)는 컨테이너의 역할 외에 Flash 컨트롤의 스크린 상에서의 Place Holder 역할을 합니다. 즉 윈도 메니징 API 함수들을 이용하여 AtlAxWin 윈도를 이동/리사이징/보이기/숨기기 등등을 수행할 수 있습니다. 추가적인 메세지 핸들링이 필요하면 CFlashconAxWindow 함수를 상속하여 메세지 핸들러를 추가해주면 됩니다.
소스코드
a) 프로젝트에 공통으로 포함해야 하는 파일
ScopeGuard.h
MessageHook.h
FlashconAxImpl.h
b) MFC 프로젝트에 추가로 포함해야 하는 파일
FlashconAxWindow.h
FlashconAxWindow.cpp
c) ATL/WTL 프로젝트에 추가로 포함해야 하는 파일
FlashconAxWindow_WTL.h