2014년 10월 27일 월요일

윈도우를 반투명하게...

우선 반투명 효과는 윈도우2000 이상에서만 지원된다는 것을 알아두길 바란다. 윈도우98에서 한다고 에러가 나진 않지만, 반투명효과는 나오지 않는다.

 ::SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED);
 ::SetLayeredWindowAttributes( m_hWnd, 0, (255 * 70) / 100, LWA_ALPHA);

원래는 위와 같이 하면 된다고 하는데...vc6에서는 안되나? 아무튼 SetLayeredWindowAttributes 요놈이 없다고 하면서 안된다면 USER32.DLL에서 불러오면 된다고 한다.

 typedef BOOL (WINAPI* pSLWA)(HWND, COLORREF, BYTE, DWORD);

 pSLWA pSetLayeredWindowAttributes = NULL;

 // "user32.dll"을 로드해서 SetLayeredWindowAttributes를 찾는다.

 HINSTANCE hmodUSER32 = LoadLibrary("USER32.DLL");

 pSetLayeredWindowAttributes = (pSLWA)GetProcAddress(hmodUSER32, "SetLayeredWindowAttributes");

 ::SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED);
 pSetLayeredWindowAttributes( m_hWnd, 0, (255 * 70) / 100, LWA_ALPHA);

위와 같이 해주면 된다. 이 때, LWA_ALPHA와 GWL_EXSTYLE이 없다고 나오면...선언해주자.

#define WS_EX_LAYERED   0x00080000    //확장 스타일

#define LWA_COLORKEY    0x00000001    //투명색상 지정

#define LWA_ALPHA       0x00000002    //반투명 정도 지정

#define ULW_COLORKEY    0x00000001  

#define ULW_ALPHA       0x00000002

#define ULW_OPAQUE      0x00000004

위와 같이 해주면 된다.

위 함수에서 핸들은..투명하게 하고자 하는 윈도우의 값이다. 프로그램 시작부터 투명하게 하려면..Initinstance()에서 위의 처리를 해주면 된다~

 ///////////////////////////////////////////
 //반투명 윈도우로 만듭니다.
 SLWA pSetLayeredWindowAttributes = NULL;
 HINSTANCE hmodUSER32 = LoadLibrary("USER32.DLL"); //라이브러리를 불러와서
 pSetLayeredWindowAttributes=(SLWA)GetProcAddress(hmodUSER32,"SetLayeredWindowAttributes"); //함수포인터를 가져오고.

 SetWindowLong(m_pMainWnd->m_hWnd, GWL_EXSTYLE,GetWindowLong(m_pMainWnd->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); //윈도우 스타일을 변경.
 pSetLayeredWindowAttributes(m_pMainWnd->m_hWnd, 0, (255 * 70) / 100, LWA_ALPHA); //윈도우 투명도를 조절한다.
 //////////////////////////////////////////데브피아 참고.



추가로 윈도우가 움직이거나, 사이즈가 조절될 때, 반투명하게 만들고 싶으면..아래와 같이 하면 된다.

메시지맵에 아래를 추가한다.

 ON_MESSAGE(WM_ENTERSIZEMOVE, OnEnterSizeMove)
 ON_MESSAGE(WM_EXITSIZEMOVE, OnExitSizeMove)

헤더파일에 위의 두개의 함수를 추가해준다.
afx_msg LRESULT OnEnterSizeMove(WPARAM wParam, LPARAM lParam);
 afx_msg LRESULT OnExitSizeMove(WPARAM wParam, LPARAM lParam);

그리고 각각의 함수에서, 아래와 같이 해준다.

 ::SetLayeredWindowAttributes( m_hWnd, 0, (255 * 100) / 100, LWA_ALPHA);
 ::SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) &~WS_EX_LAYERED);

    return 0L;

물론 SetLayeredWindowAttributes 요놈이 없다고 나오면 맨 위에 설명해준 것 처럼 하면 된다~

댓글 없음: