Introduction
I always wondered how to make a window transparent so that all the clicks on the window filter down to the window underneath .At last Microsoft has provided support in Windows Me and 2000 for creating transparent windows . And alpha-blending (This support is not there in previous platforms). In previous platforms (Win 9x ) one could use SetWindowRgn
to make only specified part of a window visible but creating a really transparent window wasn�t so easy .
So Lets get on with the code . The support added by Microsoft Lies in a new function named SetLayeredWindowAttributes
. But before you can use this function you have to tell Windows that your window is a layered window . This causes Windows to internally allocate the buffers required for creating layered, translucent effects. The code for doing this is
SetWindowLong (hWnd , GWL_EXSTYLE ,
GetWindowLong (hWnd , GWL_EXSTYLE ) | WS_EX_LAYERED ) ;
Here The hWnd
is the handle to the window which has to be set transparent. GWL_EXSTYLE
parameter is used for accessing and modifying the extended style of the window. WS_EX_LAYERED
parameter is the window style for a layered window. If the compiler gives you an error of undefined variable WS_EX_LAYERED
then define it as
# define WS_EX_LAYERED 0x80000
After you have done this you can now call the magic function SetLayeredWindowAttributes
. Let me show you the code snippet from the sample.
HWND hWnd=this->m_hWnd;
typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
PSLWA pSetLayeredWindowAttributes;
HMODULE hDLL = LoadLibrary ("user32");
pSetLayeredWindowAttributes =
(PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
if (pSetLayeredWindowAttributes != NULL) {
pSetLayeredWindowAttributes (hWnd,
RGB(255,255,255), factor, LWA_COLORKEY|LWA_ALPHA);
}
The Code first loads the library User32.lib which defines the SetLayeredWindowAttributes
function. It then gets the address of the function SetLayeredWindowattributes
by using GetProcAddress
. It checks if it has got a valid function pointer to ensure that it is not going to crash if run on platform other than Win 2000 and Win Me. It then calls the SetLayeredWindowAttributes
Function .
Color Keys
Color Keys are a way of telling the Windows that which color to take as being transparent. Say if you set the Color Key to Blue and select LWA_COLORKEY
flag in the SetLayeredWindowAttributes
then wherever in you window Color Blue appears it will be taken as transparent and Windows will show whatever lies beneath that color.
Alpha Blend Factor
Alpha Blend factor that is the third parameter in SetLayeredWindowAttributes
indicates and controls the degree of transparency. It has to be within range of 0 to 255 and you have to specify LWA_ALPHA
flag in the fourth parameter to say that the Alpha Blend Factor is valid. When Alpha Blend factor is 0 then window is completely transparent and when it is 255 window is Opaque.
NOTE : You may have to define the two flags LWA_ALPHA
and LWA_COLORKEY
as
#define LWA_COLORKEY 1
#define LWA_ALPHA 2
in case of a compiler error. When Window is transparent all the clicks on the window go down to the window underneath it .
The Sample
The Sample program provided is very simple. It sets the Layered attribute of windows in OnInitDialog
Function and then sets the timer to send WM_TIMER
Messages to the window. In the OnTimer
Function (The handler of WM_TIMER
Message) Color key is set to white and Alpha-blend factor is varied from 0 to 255 and back to 0 to make the image appear and then disappear .
Acknowledgement
I really am thankful to all the articles written on transparent windows that I read before writing this one for CodeProject.