子ウィンドウ全体に描画されるビットマップで、RGB ( 0, 0, 255 ) で認識される透明領域を持つ子ウィンドウを作成しようとしています。
以下は、透明にするために使用しているコードです。問題は、子ウィンドウの透明部分の下にある親ウィンドウも透明になり、それを通してデスクトップが見えることです。
hwndChild = ::CreateWindowEx ( 0, "mycustomwindow", txt.c_str ( ), WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD, x, y, width, height, parent, 0, hInstance, ( LPVOID ) this ) ;
transparent ( );
void transparent ( )
{
HMODULE hUser32 = GetModuleHandle ( ( "USER32.DLL" ) );
COLORREF g_ColourKey = 0xFF00FF; // 0,0,255(magenta) in RGB hex value
typedef BOOL ( WINAPI *lpfnSetLayeredWindowAttributes ) ( HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;
SetLayeredWindowAttributes = ( lpfnSetLayeredWindowAttributes ) GetProcAddress ( hUser32, "SetLayeredWindowAttributes" );
if( SetLayeredWindowAttributes == NULL )
{
MessageBox ( hwndChild, "Error, cannot load window transparency\n REASON: Could not load User32.DLL", "Error!", MB_ICONSTOP | MB_OK );
}
else
{
DWORD dwStyle = GetWindowLong ( hwndChild, GWL_STYLE );
dwStyle &= ~( WS_CAPTION | WS_SIZEBOX );
SetWindowLong ( hwndChild, GWL_STYLE, dwStyle );
InvalidateRect ( hwndChild, NULL, true );
SetWindowPos ( hwndChild, NULL, 0, 0, wWidth, wHeight, SWP_NOMOVE | SWP_NOZORDER );
SetWindowLong ( hwndChild, GWL_EXSTYLE, GetWindowLong ( hwndChild, GWL_EXSTYLE ) | WS_EX_LAYERED );
SetLayeredWindowAttributes ( hwndChild, g_ColourKey, 0, LWA_COLORKEY );
}
};
親ウィンドウ (最上位ウィンドウ) 自体は、次の dwStyle を使用して、同じ関数を使用して特定の部分を透明にしています。WS_CLIPCHILDREN