본문 바로가기
카테고리 없음

[MFC] 투명 윈도우 만들기

by Rico0101 2024. 5. 20.
반응형

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)

(참고 : https://m.blog.naver.com/PostView.naver?blogId=tipsware&logNo=221426294710&proxyReferer=https:%2F%2Fwww.google.com%2F&trackingCode=external )

반응형