Click here to Skip to main content
13,190,405 members (51,482 online)
Click here to Skip to main content
Add your own
alternative version


51 bookmarked
Posted 14 Dec 2004

Yet Another Transparent Static Control

, 14 Dec 2004
Rate this:
Please Sign up or sign in to vote.
Two other methods of making a transparent static control.

Sample Image - TransparentStatic.jpg


There are many ways to develop a transparent static control. I like two approaches in particular, because they are simple and they get the job done. When you think about placing a static control with a transparent background on your window, the one important thing you have to consider is, whether the background is static or dynamic. The problem of having a static control changes depending on what is displayed in the background.

Method 1

If the background is static, then the best approach is to make a copy of the area on the parent window behind the static control before it is drawn for the first time, and then simply copy the image back to the parent every time the static control needs to be redrawn. The advantage of this approach is its flicker free display every time the static control is changed.

LRESULT CTransparentStatic2::OnSetText(WPARAM wParam,LPARAM lParam)

   LRESULT Result = Default();
   return Result;

HBRUSH CTransparentStatic2::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
   return (HBRUSH)GetStockObject(NULL_BRUSH);

BOOL CTransparentStatic2::OnEraseBkgnd(CDC* pDC)
   if (m_Bmp.GetSafeHandle() == NULL)
      CRect Rect;
      CWnd *pParent = GetParent();
      pParent->ScreenToClient(&Rect); //convert our corrdinates to our parents

      //copy what's on the parents at this point
      CDC *pDC = pParent->GetDC();
      CDC MemDC;
      CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);



   else //copy what we copied off the parent the first time back onto the parent
      CRect Rect;
      CDC MemDC;
      CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);

   return TRUE;

Method 2

The other approach comes in handy when the parent window's background is dynamic. If the parent window's background is constantly changing then the above approach will not look too nice. So instead of all the copying, what the static control should do is invalidate the area of the parent where the control resides every time its text is changed. This method is much simpler than the one before, but it could flicker if the text is changed at a rapid rate.

LRESULT CTransparentStatic::OnSetText(WPARAM wParam,LPARAM lParam)

   LRESULT Result = Default();
   CRect Rect;
   return Result;


HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)

   return (HBRUSH)GetStockObject(NULL_BRUSH);


Keep an eye out for a Transparent Edit control and Transparent Listbox.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Ali Rafiee
United States United States
Ali Rafiee has been developing windows applications using C++ since 1991, and he hasn't looked back since. Ali has been a software development consultant for must of his career, but he has finally settled down and has been working for an educational software company since 2000. While he is not working, he is either learning C#, flying airplanes, playing with his daughter, or answering peoples question on newsgroups, he finds that to be a great learning tool for himself.

Ali is also a Microsoft Visual C++ MVP.

You may also be interested in...


Comments and Discussions

GeneralRe: Transparent Edit Control Pin
Ali Rafiee29-Jan-07 4:53
memberAli Rafiee29-Jan-07 4:53 
AnswerRe: Transparent Edit Control Pin
Ali Rafiee8-Jun-07 10:22
memberAli Rafiee8-Jun-07 10:22 
GeneralHOLLOW_BRUSH is enough Pin
Vladmiir18-Apr-06 0:50
memberVladmiir18-Apr-06 0:50 
AnswerRe: HOLLOW_BRUSH is enough Pin
Ali Rafiee18-Apr-06 6:22
memberAli Rafiee18-Apr-06 6:22 
That will work just fine as long as you're not going to change the text of the static control, and what's displayed behind the control is not changing either.

If you notice CTransparentStatic2::CtlColor is doing exactly what you are saying (I would argue that doing this in CStatic is much cleaner than catching WM_CTLCOLOR in the Dialog, you will only have to do it once in CStatic vers. many times if you have more than one dialog that will need to display transparent static controls).

The rest of the code in OnEraseBkgnd and OnSetText is to allow the user to call SetWindowText and change the Text of the static.

Using your approach try changing the static controls text by calling SetWindowText. You will see that old text is there along with the new text, unless you redraw force a redraw of the background window (that will cause flickering)

GeneralRe: HOLLOW_BRUSH is NOT enough Pin
Moak14-Mar-08 2:23
memberMoak14-Mar-08 2:23 
QuestionTransparency when dialog is not showed then showed ... Pin
ouquoi16-Feb-06 5:02
memberouquoi16-Feb-06 5:02 
AnswerRe: Transparency when dialog is not showed then showed ... Pin
Ali Rafiee16-Feb-06 9:59
memberAli Rafiee16-Feb-06 9:59 
GeneralRe: Transparency when dialog is not showed then showed ... Pin
ouquoi16-Feb-06 21:47
memberouquoi16-Feb-06 21:47 
GeneralRe: Transparency when dialog is not showed then showed ... Pin
Ali Rafiee17-Feb-06 4:33
memberAli Rafiee17-Feb-06 4:33 
GeneralRe: Transparency when dialog is not showed then showed ... Pin
ouquoi19-Feb-06 21:25
memberouquoi19-Feb-06 21:25 

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.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.171016.2 | Last Updated 14 Dec 2004
Article Copyright 2004 by Ali Rafiee
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid