BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
// WS_EX_LAYERED 속성을 추가해 준다.
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE,
GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
// 많은 예제에서 위의 코드를 사용하는데
// 왜 저렇게 복잡하게 사용하는지.. 윈도우 핸들을 넘겨 주려 하는건가??
// 아래와 같이 ModifyStyleEx함수를 호출 해도 무관하다.
// 단 이 함수는 투명화할 윈도우의 클래스의 멤버함수를 호출해야..
ModifyStyleEx(0, WS_EX_LAYERED );
// 이제 Layered Window를 투명하게 만들어줄 함수를 호출해야한다.
// 함수포인터 선언, 초기화.
SLWA pSetLayeredWindowAttributes = NULL;
// 인스턴스 얻음.
HINSTANCE hmodUSER32 = LoadLibrary("USER32.DLL");
//함수포인터 얻음.
pSetLayeredWindowAttributes=(SLWA)GetProcAddress(
hmodUSER32,"SetLayeredWindowAttributes");
// 알파 블렌딩 적용. 첫번째에 투명화할 윈도우 핸들을 넘겨 주고
// DEGREE라고 한 부분에 255이하 숫자를 주면 된다. 255는 투명 없고, 0이면 안보인다.
pSetLayeredWindowAttributes(GetSafeHwnd(), 0, DEGREE, LWA_ALPHA);
가끔 상수가 정의되지 않아서 에러가 날때가 있다.
이때는 예제 코드 윗부분에 다음 정의가 필요하다.
// 함수 원형 정의
typedef BOOL (WINAPI* SLWA) \
(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
// 상수 정의
#ifndef WS_EX_LAYERED
#define WS_EX_LAYERED 0x00080000
#define LWA_ALPHA 0x00000002
#endif
만약 알송의 가사 창 처럼 투명한 위도우를 클릭했을때 클릭이 윈도우를 통과해서 아래의 윈도우가 받도록 하고 싶다면?
먼가 복잡한게 있을거 같았는데 너무 간단한다. WS_EX_TRANSPARENT 속성만 추가해 주면 된다.
ModifyStyleEx(0, WS_EX_TRANSPARENT);
이렇게 해주면 투명한윈도우든 아니든 클릭하면 밑에 있는 윈도우가 클릭을 받는다. 만약 투명한 윈도우가 클릭이 통과 되도록 하려면 위에 윈도우 속성 설정하는 부분에서
ModifyStyleEx(0, WS_EX_TRANSPARENT | WS_EX_LAYERED );
이렇게 해주면 끝난다.
1. 헤더파일에 소스코드 추가
typedef BOOL(WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);
2. 투명 다이얼로그 메서드 만들기
view sourceprint?
01.void CSampleDlg::SetTransparent(int percent)
02.{
03. SLWA pSetLayeredWindowAttributes = NULL;
04.
05. HINSTANCE hmodUSER32 = LoadLibrary("USER32.DLL");
06. pSetLayeredWindowAttributes =
07. (SLWA)GetProcAddress(hmodUSER32,"SetLayeredWindowAttributes");
08.
09. HWND hwnd = this->m_hWnd;
10. SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE) | WS_EX_LAYERED);
11. pSetLayeredWindowAttributes(hwnd, 0, percent, LWA_ALPHA);
12.}
3. 투명 다이얼로그 적용하기
SetTransparent( 100 );
투명도를 100으로 설정한 다이얼로그 모습입니다.
투명도는 0에서 255까지 설정할 수 있습니다.
4. 지정 색상 투명화
SetLayeredWindowAttr(RGB(255,0,255), 0, LWA_COLORKEY)