신형철님의 “네이트온 처럼 플래시콘 만들기“ 강좌를 바탕으로하여 만들었습니다.
( http://www.devpia.com/Forum/BoardView.aspx?no=7144&ref=7144&page=3&forumname=vc_lec&stype= )
MFC/ATL/WTL/WIN32 환경에서 사용할 수 있지만 Layered Windows 지원 때문에 Win2000 이상에서만 windowless 모드로 투명하게 작동합니다. ( Win98 등등의 환경에서는 그냥 window 모드로 작동합니다. (작동할 겁니다.) )
이 코드는 WIN98, WIN2K, WINXP 에서 테스트 해봤습니다. 개선사항이나 버그 발견하시면 꼭 알려주시면 감사하겠습니다.
(추가)
Layred Window가 지원이 안되는 Window 2000 이전의 환경에서는 자동으로 영역(HRGN)과 ::SetWindowRgn() API 함수를 사용하여 투명 영역을 제거하는 방법을 사용하도록 수정하였습니다. 따라서 WIN98/Me/NT4 에서도 플래시콘을 사용할 수 있습니다. (NT4의 경우 ::AlphaBlend() API를 사용하기 위하여 Msimg32.dll 를 다른 시스템에서 복사해 와야 한다고 합니다.) 영역과 ::SetWindowRgn() API를 사용하는 방법의 경우 완벽하게 동작하는 UpdateLayeredWindow() 방법에 비해서 두 가지 문제점이 있습니다.
첫 번째는 반투명 영역(Alpha transparency 가 적용되는 Translucent 영역) 에 에니메이션이 겹치는 경우 반투명 영역에 에니메이션의 잔상이 남습니다. 또는 플래시콘을 드래그 이동 시켰을 경우에도 비슷한 현상이 나타납니다. 반투명 영역이 없는 플래시의 경우는 전혀 문제가 없습니다.
두 번째는 영역이 매우(!) 복잡한 경우 플래시콘이 화면에 나타나지 않습니다. 이것은 코드프로젝트에서 빌려온 CreateRgnFromFile() 함수가 매우 복잡한 영역(많은 숫자의 작은 조각 영역)의 경우 올바른 영역 핸들(HRGN)을 적절하게 돌려주지 못하기 때문인데 (복잡한 경우 계산 시간이 오래 걸려서 발생하는 문제입니다.) 차후 더 나은 성능의 함수를 발견하게 되면 해결될 수 있지 않을까 생각됩니다. 적당한 크기의 매우 복잡하지 않은 크기의 플래시의 경우는 잘 작동하는 것으로 보입니다. (수정) CreateRgnFromFile() 함수가 오래 걸려서 그런것이 아니라 영역을 추출해야할 현재 플래시 프레임이 완전히 투명한 경우, 즉 CreateRgnFromFile() 함수의 결과가 빈 영역인 경우에 윈도 영역을 완전히 제거해버리는 상황이 발생하게 되고 이 결과로 추가적인 WM_PAINT 메세지가 발생하지 않고 이렇게 WM_PAINT 메세지가 발생하지 않게 되었기 때문에 플래시 에니메이션이 화면에 표시되지 않습니다. 시간 나는대로 해결책을 찾아볼 예정입니다. (CreateRgnFromFile() 함수는 매우 잘 동작하는 것으로 보입니다.)
세 번째로 영역과 ::SetWindowRgn() 을 사용하는 경우에는 TransparentKey 설정이나 알파 투명도 설정을 사용하면 화면 잔상 / 깜빡임 문제가 아주 심하게 발생합니다. 두 기능은 추가적인 옵션 기능이므로 영역과 ::SetWindowRgn()을 사용하는 경우에는 사용을 제한해야 할 것 같습니다.
(참고) CFlashconAxImplT 의 생성자에서 m_bUseWindowless 를 false 로 초기화하면 Win2K나 WinXP에서도 강제로 영역과 ::SetWindowRgn()을 사용하는 방법을 테스트할 수 있습니다.
예제프로젝트
MFC 예제 프로젝트입니다. 플래시 파일을 다이알로그에 드래그앤드랍 해주면 스크린 좌표 (50, 50) 에 가로 350, 세로 250의 크기로 드랍된 플래시 애니메이션을 windowless 모드로 재생합니다. 예제압축파일에 swift3d.swf, opener.swf 라는 플래시 파일을 포함했습니다. 이 파일은 http://www.webreference.com/js/column85/ 에서 다운로드 받은 파일입니다. 다이알로그에 있는 “==33” 버튼을 누르면 플래시 재생 위치를 이동시키면서 alpha transparency 값을 50% 바꿔줌으로써 플래시가 반투명 상태로 재생합니다.
(참고)
Gunii House 에서 예제를 테스트해볼 수 있는 추가 플래시콘 파일 (anicon.zip) 을 다운 받을 수 있습니다.
( http://gunii.com/bbs/zboard.php?id=study&no=200 )