Download source files - 4 KbDownload demo project - 28 Kb
Introduction
One of the attractive new features of Windows 2000 is the menu and other selections that fade away instead
of just disappearing. To see this in operation you need to select "Use transition effects for menus and tooltips"
on the "Effects" tab of the Display Properties dialog and then select "Fade effect" in the combo box.
In this article I present a simple MFC class that allows you to apply a similar fading effect to any window
you choose - with only one line of code! Don't just close a window - have it fade away!
The effect is most appropriate to small windows; I use it most often for splash
windows, about boxes and other small dialogs.
To use the code you just add the FaderWnd source and header files to your MFC project, include the header
in the relevant source file and construct a CFaderWnd
when you want your window to fade. The CFaderWnd
object itself takes care of fading your window and then destroying and deleting itself.
The only code you need to write is new CFaderWnd(this)
. Once the CFaderWnd
is constructed
you can destroy or hide your window, or call EndDialog
if the window is a modal dialog.
For example, a modeless dialog (or it could be any child window):
void CFadeTestDlg::OnClose()
{
new CFaderWnd(this);
DestroyWindow();
}
or a modal dialog:
void CFadeTestDlg::OnOK()
{
if (UpdateData)
{
new CFaderWnd(this);
EndDialog(IDOK);
}
}
void CFadeTestDlg::OnCancel()
{
new CFaderWnd(this);
EndDialog(IDCANCEL);
}
How it works
The CFaderWnd
uses the new layered windows feature and the UpdateLayeredWindow
API function.
The constructor creates a new topmost window with the WS_EX_LAYERED
style (among others) and with the same size and position
as the source window (the window to be faded). It then uses UpdateLayeredWindow
to fill the new window
with a bitmap that is an exact copy of the source window. It also sets up a timer. When the constructor returns the source window
can be destroyed (or hidden) and the new window remains visible.
On each timer message CFaderWnd
calls UpdateLayeredWindow
again with a smaller value of alpha. Reducing
the alpha value makes the window increasingly translucent. When alpha is at or very near zero CFaderWnd
destroys the window and
PostNcDestroy
deletes the CFaderWnd
object.
The CFaderWnd
constructor takes three parameters; it looks like
this:
CFaderWnd(CWnd *pWndToFade, UINT nFadeTime = 2000, BYTE byAlpha = 255);
The second and third parameters are optional; the examples above all use the default values for these parameters.
For obvious reasons (and if they're not obvious you shouldn't be reading this) the first parameter, which specifies
the window to fade, must be supplied.
CWnd *pWndToFade | This is a pointer to the source window (the window to be faded).
|
UINT nFadeTime | This is a number of milliseconds for the whole duration of
the fade. The default value gives a 2 second fade. |
BYTE byAlpha | This is the alpha value at which to start the fade. The
default value of 255 represents starting with a fully opaque window. You
might choose to start at 127, for example, so that the window immediately
becomes semi-transparent and then fades from there. |
UpdateLayeredWindow
is only available on Windows 2000, so if the code were to call that function directly any
program using the CFaderWnd
class would fail to run on any other platform. I usually want my programs to run
on any Win32 platform but to use the new features when they're available. Therefore the code does not call UpdateLayeredWindow
directly. Instead it uses GetProcAddress
to find out whether the function is available and calls it through the
returned pointer when it is. If the function is not available CFaderWnd
quietly deletes itself so it behaves as
a no-op on older platforms. Thus you can use CFaderWnd
in all your programs without compromising their ability
to run on all Win32 platforms.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.