in one of my previous posts i described a lightbox class that was activex friendly.
the old post is here: vfp lightbox class - now activex friendly
unfortunately because of the logic used in the class, for large "busy" forms with a large number of objects, it caused a couple of seconds delay before the lightbox was displayed and even then on slower computers the screen update was noticeably slow.
so i had another look at the logic of the previous version and threw away most of the code. the result is a lean, mean lightbox that is very snappy to display. it now uses only the gdi+x imgcanvas class exclusively for its display.
to ensure speed the following must be observed:
- the class will only work on a form. it will not support any other containers
- it requires the gdi+x libraries (system.app and gdiplus.vcx/vct)
- it is however,activex friendly
to use it is simplicity itself as shown in the sample form.
just drop the class on a form and call it as shown.
lparameters tcmsg
local lret as boolean
thisform.bbgdilightbox1.showlightbox(.t.)
if messagebox(tcmsg,292,"are you sure?",0) = 7
lret = .f.
else
lret = .t.
endif
thisform.bbgdilightbox1.showlightbox()
return lret


in the control.beforedraw() method you will find some code like this:
* change the colours as needed here
* possible colours are (220,128,0,0),(220,0,0,128) etc.
lobrush = .solidbrush.new(.color.fromargb(220,0,0,0))
these are argb where the first number denotes the opacity
0 = full transparent, 255 = full opaque
the other 3 numbers are just 3 rgb numbers to denote the colour to be used. you can change these to get different lightbox colours as below.
the complete source code and sample form can be downloaded from the attachment link below. enjoy.

it was also suggested that a shape object be used instead with its drawmode property = 9.
while
that would work in some cases, because of the way vfp displays colours,
when the form or image control on the form has a picture set, this is
the result - 8 bit colours under the control. also the control can
never support activex and they come to the top.

Attached Files:
- 8974_bbgdilightbox-v6.zip
8974_bbgdilightbox-v6.zip
Hi Bernard,
Really cool stuff.
Sorry for asking, but It’s just too fast for me. I like slow fading. Where can I tweak it?
Thanks.
Check out this one:
http://weblogs.foxite.com/bernardbout/archive/2008/09/25/6871.aspx
Hi Bernard
Thanks for the class. I tried it briefly and I think it does not overlay the child forms on the VFP desktop (attached the object to _SCREEN). Is there something else I need to do over and above what the sample has?
Thanks and regards
Bhavbhuti
This one is for forms not _screen. I thought I made that clear in the blog.
However it can easily be made to work for _screen with a few changes.
Hi Bernard,
When I use the command button more than once, the activex control becomes darker and darker. I click on commnad2 (lightbox) for the first time, select “No”. The activex is redisplayed ok. Then, I click again on command2, select “No”. The activex control is redisplayed but is semi transparent. As I repeat this, this control becomes darker and darker and after 4 to 5 times, becomes completely black.
I had changed opacity value to 135 in this line of VCX.
loBrush = .SolidBrush.New(.Color.FromArgb(135,0,0,0))
What’s wrong?
Vivek
When you say “Activex” you mean the web browser control. You are
telling me something I already know. Does the DateTime picker Activex also
become blacker? How about any other Activex control?
You see I did not program the Microsoft Web browser control nor did I program VFP. That is a problem between VFP and the Web Browser control over which I have no control.
Have you tried with any other Activex control?
needed here
Hi Bernard, thanks for sharing it. Just a tough you may add .Anchor = 15 in the Setup Method.
With This
.Left = 0
.Top = 0
.Height = ThisForm.Height
.Width = ThisForm.Width
.Anchor = 15
.ZOrder(0)
.Visible = .F.
EndWith
Good point Luis. Missed that. Either above code or just set the anchor property = 15 in the class itself. Thanks
Good job bernard, i really like it!
Thank you. Thank you. Thank you. As soon as I saw my first lightbox, I knew I wanted to add it to my apps. (Being ‘hit over the head’, as the Nielsen Norman Group calls it, is just what my clients need.) As you stated, your original solution was too slow, but this one is plenty fast.
Like Bhavbhuti, I also want to use it when multiple forms are open, but I was able to do that without changing your class. I put your control on every form, and then when I need the lightbox effect, I call the following program:
LPARAMETERS tlShowHide
FOR EACH oForm IN _SCREEN.Forms
oForm.bbgdilightbox1.ShowLightbox(tlShowHide)
ENDFOR
I have found that a translucency (a.k.a. opacity) setting of 80 gives the desired effect while still allowing users to read what’s on the screen.
man, that’s really so cool
– wonderful class
Hi Bernard, thanks for great class.
I found an issue when using dual monitors. The class cannot work properly in 2nd monitor.
Hope you can fix the bug.
thanks
Nice. Thank you Bernard.