Click here to Skip to main content
Click here to Skip to main content

Transparent controls with custom image backgrounds on PocketPC

By , 15 Aug 2003
 

Sample Image - transparent_controls.jpg

Introduction

I was writing a program on PPC 2002 and the program UI required a dialog with a bitmap image background. As I was designing the dialog in the eVC++ 3.0 dialog template editor, I added controls like static texts, group boxes and etc. I checked the transparent option in the property of each of the controls that I have added to the dialog. But on PPC 2002 the transparent option does not work like it does on PC Platform OSes. On CE, transparent windows behave as if they have WS_CLIPCHILDREN style set. You can see through the parent dialog window itself. Definately not the effect I was hoping for.

There is an article for making transparent static texts at http://www.pocketpcdn.com/ and http://www.pocketpcdn.com/articles/transparent_static.html.  It basically draws all of the static text in the WM_PAINT handler of the parent dialog procedure.  But if you have other controls such as group boxes, you will have to draw the group boxes yourself.

To solve this problem, I used the WM_CTLCOLORSTATIC message handler. I first created a pattern brush with the bitmap image to be used as the backround for the dialog window.  And in the WM_CTLCOLORSTATIC message handler in the dialog procedure, I returned the brush handle I created previously.  The downside to this method is that you'll have to create separate brushes for each of the controls that are to be transparent which means more memory usage.  But you get the desired effect.

License

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

About the Author

Hyungchul Shin
Web Developer
Korea (Republic Of) Korea (Republic Of)
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 2memberdadahacker19 Jun '09 - 18:15 
too simple ,no value
GeneralException when there are many, many objectsmemberacp92329 Mar '06 - 4:17 
When there are about 600 or so controls, each w/ its own CBrush, eventually a message box is displayed that states "Required Resource was" There is still a good amount of memory, but I seem to be running into a resource limit? Ideas?
 
thanks!
 
-- modified at 10:18 Wednesday 29th March, 2006
QuestionWhat if you have a dynamic bitmap background ?memberghostve28 Dec '04 - 3:29 
First of all congratulations on a very good article.
But your article only works for a static background image you know beforehand. What happens
when you have a dynamic background ? I have tried copying the background of the parent window,
but alas I only get the background of the parent window (because of the CLIPCHILDREN peculiarity
of windows CE). Is the solution to handle all painting of my controls from the paint event of the parent dialog (so everything will be painted on the same dc) ?
AnswerRe: What if you have a dynamic bitmap background ?sussAnonymous28 Dec '04 - 3:59 
You can create new brush from the changed bitmap and return
it as the return value of WM_CTLCOLORSTATIC handler. I haven't tested it
with an actual code but i think it will work.
GeneralThe WM_CTLCOLORSTATIC message handler and comboboxes.memberDe Nys, FX11 Apr '04 - 10:47 

I'm using this principe of building brushes for each transparent control in my form and return theim in the WM_CTLCOLORSTATIC message handler. It works great ! Thanks.
 
But...
 
What about the comboboxes ?
It seems to does not work so fine ;-( .
The arrow, on the right, the borders are transparent but the label is not.
I suppose it's because no brush is made for the lable contained in the combobox Frown | :-(
 
Any solution ?
GeneralApply this sample only on the second DlgBoxmemberGuilhemMtp31 Mar '04 - 5:25 

 
I want to use this sample only with myu seond dialog box.
There is no matter to load the BMP, but all the static controls aren't transparent.
 

 

Do you know why button can't be transparent?
 

Thank you
 
Sorry for My poor English Wink | ;)
GeneralRe: Apply this sample only on the second DlgBoxsussAnonymous14 Apr '04 - 2:33 
Buttons are whole different kind of controls..
You should ownder draw the button with the
backgound image.
GeneralRe: Apply this sample only on the second DlgBoxmemberwqter25 Jun '04 - 0:12 
ON_MESSAGE( WM_CTLCOLORBTN, OnCtlColorButton )
try to rewrite the handler to this message
 
hah
GeneralYou can have only one brush...memberDic27 Oct '03 - 3:47 
You can have only one brush with background image.
 
HBRUSH g_hBkBrush;
 
....
 
case WM_CTLCOLORSTATIC:
{
HDC hStaticDC=(HDC)wParam;
HWND hStaticWnd=(HWND)lParam;
RECT rc;
 
::GetWindowRect(hStaticWnd,&rc);
::MapWindowPoints(hStaticWnd,hWnd,(POINT*)&rc,2);

::SetBrushOrgEx(hStaticDC,-rc.left,-rc.top,NULL);
 
return (LRESULT)g_hBkBrush;
}
break;
 
...
GeneralRe: You can have only one brush...memberJohann Gerell30 Oct '03 - 23:19 
Dic wrote:
You can have only one brush with background image
 

No. Keep track of which control a particular WM_CTLCOLORSTATIC belongs to and asssociate separate brushes for each control if you have a bg image you want show hrough the control.
 
--
Human beings, who are almost unique in having the ability
to learn from the experience of others, are also remarkable
for their apparent disinclination to do so. (Douglas Adams)

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130523.1 | Last Updated 16 Aug 2003
Article Copyright 2003 by Hyungchul Shin
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid