윈도우를 투명하게 만들기 Win2000이상
개발 2007. 9. 13. 13:53가끔 윈도우를 투명하게 하고 싶을때가 있는데, 이렇게 윈도우 전체를 투명하게 하는 방법이 있다. 이 방법은 윈도우가 WS_CHILD 속성을 가지고 있을 경우에는 효과가 나타나지 않는다. 즉 어떤 윈도우의 자식인 이부분의 윈도우를 투명하게는 못한다. 윈도우위 하위 윈도우를 투명하게 할때는 직접 그려주는 방법밖에는 없는듯 한다. WIN32 로는 AlphaBlend 함수를 이용하면 되고, GDI+ 를 이용하면 더 간단하게 투명하게 그릴수가 있다.
아래는 간단하게 윈도우 전체를 투명하게 하는 방법이다. SetLayeredWindowAttributes 함수를 이용해서 동작하는 간단한 효과이다.
BOOL SetWindowTransparent(HWND hWnd, BYTE nAlpha)
{
if( FALSE == ::IsWindow(hWnd))
return FALSE;
#define LWA_ALPHA 0x00000002
// 투명윈도우를 위한 LayeredWindow 설정
long oldWinStyle = GetWindowLong(hWnd, GWL_STYLE);
::SetWindowLong(hWnd, GWL_STYLE, oldWinStyle & WS_POPUPWINDOW & ~WS_BORDER );
LONG style = ::GetWindowLong(hWnd, GWL_EXSTYLE);
if(!(style & 0x00080000))
{
::SetWindowLong(hWnd, GWL_EXSTYLE, style | 0x00080000);
}
typedef BOOL (WINAPI *SLWA)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
SLWA pSetLayeredWindowAttributes = NULL;
HINSTANCE hUSER32 = LoadLibrary("USER32.DLL");
pSetLayeredWindowAttributes=(SLWA)GetProcAddress(hUSER32,"SetLayeredWindowAttributes");
BYTE chAlpha = nAlpha;
pSetLayeredWindowAttributes(hWnd, NULL, chAlpha, LWA_ALPHA);
FreeLibrary(hUSER32);
return TRUE;
}