Click here to Skip to main content
15,867,686 members
Articles / Desktop Programming / MFC
Article

Transparent Windows Support in Win 2000 and Win ME

Rate me:
Please Sign up or sign in to vote.
4.74/5 (18 votes)
3 Aug 20023 min read 168K   2.3K   32   28
If you want to make your window transparent but don't know how, here is the answer to your question

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) {
    /*
    * Second parameter RGB(255,255,255) sets the colorkey 
    * to white LWA_COLORKEY flag indicates that color key 
    * is valid LWA_ALPHA indicates that ALphablend parameter 
    * (factor) is valid
    */
    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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralNo need for LoadLibrary/GetProcAddress Pin
raufatay9-Nov-08 16:30
raufatay9-Nov-08 16:30 
GeneralIf the bakground application is windows media player,it can not be transparent Pin
zseasoft13-Oct-07 22:24
zseasoft13-Oct-07 22:24 
GeneralThanks Pin
momomonet12-Mar-06 7:24
momomonet12-Mar-06 7:24 
QuestionFloodFill(...) doesn't work? Pin
qdzhulf16-Aug-05 17:04
qdzhulf16-Aug-05 17:04 
AnswerRe: FloodFill(...) doesn't work? Pin
Y-30330-Jan-06 6:53
Y-30330-Jan-06 6:53 
Generalwin 2000 problem Pin
G.A.12-Jun-05 22:09
G.A.12-Jun-05 22:09 
AnswerRe: win 2000 problem Pin
Y-30330-Jan-06 6:00
Y-30330-Jan-06 6:00 
GeneralStop saying in Win ME Pin
GreenEye2oo419-Mar-05 10:28
GreenEye2oo419-Mar-05 10:28 
JokeRe: Stop saying in Win ME (correction) Pin
Y-30330-Jan-06 5:38
Y-30330-Jan-06 5:38 
Generalwhy SetLayeredWindowAttributes can't used in 8bits(256) color quality Pin
11-Aug-04 3:36
suss11-Aug-04 3:36 
AnswerRe: why SetLayeredWindowAttributes can't used in 8bits(256) color quality Pin
Y-30330-Jan-06 5:44
Y-30330-Jan-06 5:44 
GeneralRe: why SetLayeredWindowAttributes can't used in 8bits(256) color quality Pin
asrelu30-Nov-07 6:47
asrelu30-Nov-07 6:47 
GeneralTransparent in Rich Edit Control Pin
zphuong29-Jun-04 18:41
zphuong29-Jun-04 18:41 
GeneralChild windows Pin
Neo4E656F2-Feb-03 16:54
Neo4E656F2-Feb-03 16:54 
GeneralRe: Child windows Pin
Anonymous7-May-03 13:11
Anonymous7-May-03 13:11 
GeneralRe: Child windows Pin
KonMan9-May-03 9:35
KonMan9-May-03 9:35 
GeneralRe: Child windows Pin
peterburng726-Jun-05 16:13
peterburng726-Jun-05 16:13 
GeneralSkinned windows Pin
Mugunth Kumar11-Dec-02 14:58
Mugunth Kumar11-Dec-02 14:58 
GeneralRe: Skinned windows Pin
Neo4E656F2-Feb-03 21:26
Neo4E656F2-Feb-03 21:26 
QuestionCan stop Mouse clicks .? Pin
dillip6-Nov-02 18:22
dillip6-Nov-02 18:22 
AnswerRe: Can stop Mouse clicks .? Pin
haha62425-Jan-05 2:40
haha62425-Jan-05 2:40 
QuestionCan stop Mouse clicks .? Pin
dillip6-Nov-02 18:21
dillip6-Nov-02 18:21 
GeneralWow!! Nice work!! Pin
Aisha Ikram18-Sep-02 18:53
Aisha Ikram18-Sep-02 18:53 
GeneralNot in ME... Pin
Anonymous7-Aug-02 4:04
Anonymous7-Aug-02 4:04 
GeneralEasier in VB Pin
Anonymous4-Aug-02 11:39
Anonymous4-Aug-02 11:39 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.