'SetLayeredWindowAttributes()'에 해당되는 글 1건

  1. 2008.09.19 윈도우를 투명하게!!! 1
2008. 9. 19. 11:14

윈도우를 투명하게!!!


프로그램을 하다보면 이런 저런 황당한 요구사항을 많이 겪게 된다. 가령 현재 실행되는 윈도우를 약간 투명하게 해서 그 프로그램 아래 있는 다른 것들을 볼 수 있도록 해달라는..

대충 알송의 데스크톱 가사보기와 같은 그런 걸 원하는 모양이다.

아.. 저런건 어찌 만들지...-_- 하면서 이리 저리 검색을 해본 결과.. 가능한 것이었고.. 간단한 테스트 프로그램을 통해 원하는 결과를 대충 얻어 포스팅 한다.

현재 사용하는 툴은 VS2005이고, Windows API로 작성이 되었다.

투명한 윈도우를 만들기 위해서는 SetLayeredWindowAttributes() 라는 함수를 사용해야 한다. 이녀석은 Layered Window 의 투명도 / 색상 등을 설정할 수 있는 함수이다.
BOOL SetLayeredWindowAttributes(  
    HWND hwnd,            - 투명하게 처리할 윈도우의 핸들
    COLORREF crKey,    - 대상 윈도우의 투명하게 처리할 색상(COLORREF)값
    BYTE bAlpha,           - 대상 윈도우의 투명도를 설정 ( 0 ~ 255)
    DWORD dwFlags       -  LWA_COLORKEY, LWA_ALPHA 등의 옵션
);

이 함수를 사용하기 위해서는 'Windows 2000 이상의 운영체제'여야 하고, 'Windows.h 헤더파일을 포함'하고 'User32.lib 라는 라이브러리를 사용'해야 한다. 뭐 요즘 사용하는 운영체제는 거의 XP 이상일 것이고, 윈도우즈 프로그램을 하면 기본적으로 Windows.h 와 User32.lib는 사용할 것이니.. 별로 신경을 안써도 될 듯하다.

추가로 신경을 써야 할 부분은 #include <windows.h> 위에 추가시켜 줘야 하는 부분이 있다는 것이다.

 #define WINVER 0x500  
 #define _WIN32_WINNT 0x500 
 #include <windows.h>

위와 같이 처리해주는 부분이 있어야 하는 이유는... 윈도우즈 프로그램에서는 윈도우즈 버전에 따라 사용 혹은 사용할 수 없는 함수들이 있다고 한다. Winodws 2000 이상에서만 사용되는 함수를 사용하기 위해서는 위와같이 처리해주어야 한다. 그렇지 않으면 에러가 발생할지도... ^^;

CreateWindowsEX()를 사용해 윈도우즈를 생성할 때 WS_EX_LAYERED라는 속성을 넣어준다.
아니면, 윈도우즈 생성시기가 아닌 나중에라도

SetWindowLong ( hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED );
를 쓰던지 해서 이녀석을 넣어줘야 정상적으로 투명 윈도우를 만들어낼 수 있다.

마지막으로 SetLayeredWindowAttributes() 함수를 사용한다. 이 함수의 네번 째 인자는 LWA_ALPHA를 사용하고, 세번째 인자의 값을 조절하면서 투명도를 조절하면 된다.

SetLayeredWindowAttributes(hDlg, 0, 100, LWA_ALPHA);
이렇게 처리를 해주면...
사용자 삽입 이미지

사용자 삽입 이미지
이렇게 변한다고... ㅋ


음.. 조금 신기해 주는데.. ㅋㅋ