[App 개발] 투명 윈도우를 만들자
본문
엉망으로 짠 프로그램이지만, 나름대로 설명을 달아두면 도움을 받으실 만한 분도 계시겠지요? ^^;
프로젝트명을 거창하게 FullScreenCoreImage 라고 달았지만, 아쉽게도 코어 이미지는 여기서 동원되지 않았습니다. 다음번 프로그램에서 한 번 해보죠. ^^
일단, 소스 파일은 세 개입니다. main.cpp, MainEventHandler.cpp, 그리고 Render.cpp 입니다. 이름은 cpp 로 달았지만, 클래스는 하나도 쓰지 않았으므로 그냥 c 로 달아서 쓰셔도 됩니다만, 제 코드에 보시면 코드 중간에 변수를 마구 선언해 놓은 것을 보실 수 있을 것입니다. 이것은 cpp 에서만이 가능하며, 이렇게 sloppy 하게 프로그램을 짜고 싶은 마음에 cpp 라고 선언해서 쓰고 있습니다. 다시 말씀드리면, 제가 게으르다는 뜻이죠. ㅡㅡ;
먼저 main.cpp 를 보시면...
Xcode 에서 풀빵처럼 찍어주는 Carbon 루틴이 아니라는 것을 보실 수 있을텐데요, 이게 오늘의 하일라이트, Overlay Window 입니다. Mac OS X 에 탑재된 Quartz 의 화면은 여러 장의 layer 로 구성되어 있습니다. 이 프로그램은 그 중에서도 kOverlayWindowClass 를 사용하고 있는데요, 이것이 투명 윈도우를 가능하게 하는 레이어입니다. 자세한 사항은 도움말을 참조하시고요. 따라서 이번 프로그램에서는 Interface Builder 에서 만드는 일반 윈도우가 아닌, 오버레이 레이어에 화면 가득히 윈도우를 열게 됩니다. 그 다음 CGContextClearRect 함수를 이용하여 배경의 알파 채널을 모두 투명하게 만들어 줍니다. 이제 이후에 그려지는 모든 그림들은 투명한 배경 위에 그려지게 되는 셈이지요.
그런데 여기서는 CGContextClearRect 를 이용하지 않고, 약간 다른 방법으로 재미있는 구현을 해 보았습니다. 언제나 그렇듯이 이것저것 새로운 것을 해 보는 것이 재미있는 법이지요. ㅎㅎ
MainEventHandler 부분은 대부분 프로그램이 거의 대동소이할 것입니다. 윈도우 프로그램에 익숙하신 분들에게는 이 부분을 WndProc() 이라고 말씀드리면 이해하시기 편하겠네요. 그러나 윈도우에서는 한 함수에서 해당 윈도우의 메세지를 몽땅 받는 방법으로 구현되지만, 맥의 윈도우에서는 이벤트의 클래스별로 다른 핸들러 함수를 등록할 수 있다는 점이 다른 점이겠습니다. MFC 를 써보신 분은 이 부분을 Class 로 묶어서 쓰시는 것도 좋은 방법이겠지요? 맥에서도 예전에 Think C++ 에서 클래스 라이브러리를 제공했었는데 지금은 다른 선택의 여지가 없는 것 같습니다. 그리고 대부분 Cocoa 로 넘어가고 있으니...
재미있는 부분은 몽땅 Render 에 모여있습니다. 일단 InitRender 에서부터 범상치 않은 기운을 느끼실 수 있을텐데요, GetMainDevice() 는 여러분 컴퓨터의 primary display 의 정보를 얻어내는 함수입니다. 그곳에서 PixMapHandle 을 얻을 수 있는데요, 이것이 바로 현재 화면의 비트맵 정보가 되겠습니다. 이것을 받아서 CGImage 로 만들어내는 루틴이 있습니다. 여기서는 편의상 Mask 이미지도 똑같이 적용을 했는데, 이 부분을 잘 만들어 주시면 아주 재미있는 효과를 얻으실 수 있을 것입니다. ^^ 그 다음은 지난번 프로그램에서도 출연했던 맥 걸이 오늘도 수고해 주겠습니다. ㅎㅎㅎ
타이머 루틴에서 Expand() 라는 함수를 호출하도록 만들었습니다. QDBeginCGContext 는 퀵드로우에서 코어 그래픽스 컨텍스트를 얻어내는 방법입니다. 먼저 맥 걸을 화면에 채우고, 그 위에 앞에서 받아둔 화면 비트맵을 뿌립니다. 맥 걸 위에 현재 화면의 모습이 약간 흐릿하게 출력이 되겠지요. 귀찮은 마음에 그냥 마스크 이미지를 만들지 않은 덕분에 뜻밖의 효과를 얻었습니다. ㅎㅎㅎ 타이머가 증가하면서 맥 걸의 이미지도 점점 커지게 됩니다. ^^
재미있게 즐기시고, 필요한 부분은 떼어다가 유용하게 쓰시고, 그러나 웬만하면 다른 곳에는 퍼 가지 말아 주셨으면 좋겠습니다. 저작권이니 뭐니 문제는 전혀 신경 안 쓰는데요, 워낙 프로그램을 개떡같이 짜서 얼굴 팔리는 것 때문에 그렇습니다. ㅎㅎㅎ
최신글이 없습니다.
최신글이 없습니다.
댓글목록 2
hongjuny님의 댓글
그리고 이번 프로그램도 Mac_Girl.jpg 를 손수 build 폴더에 복사해 주셔야 됩니다. 이 귀차니즘을 어찌하면 좋을까요? ㅠㅠ
재미솔솔*시니*님의 댓글
잼나게 하시네요.. 부러비라..전 윈도우로..지금 데이터 임포트 하는중인데..흐미..