우선 반투명 효과는 윈도우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 요놈이 없다고 나오면 맨 위에 설명해준 것 처럼 하면 된다~
댓글 없음:
댓글 쓰기