Introduction
This is a transparent desktop clock based on the 7 segment LCD. I published a seven segment LCD article a while ago, and based upon that control, I quickly slapped together a transparent desktop clock. It is with pleasure I am sharing it with The Code Project community.
Background
One of my colleagues walked by and was very impressed with BigClock
. He immediately requested a copy for himself, and I see it on his screen all the time.
Using the Code
The 7 segment code worked without modification in a transparent environment. However I added a class interception snippet to erase the CStatic
frames at runtime. This way, the controls in the dialog editor can have the 'sunken' style to see how big the controls are and where they are. This makes it easier to design the form for the control. Here is the code that does this:
Clcd7::Clcd7()
{
.....
firstpaint = true;
.....
}
if(firstpaint)
{
firstpaint = false;
ModifyStyleEx(WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE, 0);
}
One would ask why do this in OnPaint
? Well, the CStatic
and CWnd
based controls do not receive many messages. This way, we are taking advantage of the only message that even static
controls cannot avoid: painting.
Features
I added 12/24 hour switch, seconds display on/off switch and small/medium/large size control. I also added AutoStart, OnTop, and window placement persistence.
Screens
Medium size setting on top of the silver theme:
The small setting is ideal for a clock that is always on screen.
This is how BigClock
looks like on my development machine, in the upper right corner.
BigClock
on large setting with the setup/config dialog:
Points of Interest
The code snippet for creating transparent dialogs is as follows:
#define WS_EX_LAYERED 0x00080000
#define LWA_COLORKEY 1 // Use a color as the transparency color.
typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)
(HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
lpfnSetLayeredWindowAttributes g_pSetLayeredWindowAttributes = NULL;
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)
GetProcAddress(hUser32, "SetLayeredWindowAttributes");
SetWindowLong(m_hWnd, GWL_EXSTYLE,
GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
if(g_pSetLayeredWindowAttributes)
{
g_pSetLayeredWindowAttributes(m_hWnd, RGB(0, 255, 0), 0, LWA_COLORKEY);
}
History
- 20th January, 2008: Initial version, added taskbar hiding