#include <windows.h>
#include "tchar.h"
#include <stdio.h>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"gdi32.lib")
//#define TEXTCOLOR (RGB(189,85,178)) //紫
#define TEXTCOLOR (RGB(202,202,202))//白灰
bool bAdjustWindow=TRUE;
TCHAR * ClsName =TEXT("class_TextClock");
TCHAR * WndName = TEXT("window_TextClock");
TCHAR * lpszDayOfWeek[]= { TEXT("Sunday"),TEXT("Monday"),TEXT("Tuesday"),TEXT("Wednesday"),TEXT("Thursday"), TEXT("Friday"), TEXT("Saturday") };
TCHAR * lpszMonthOfYear[]= { TEXT("January"), TEXT("February"), TEXT("March"), TEXT("April"), TEXT("May"), TEXT("June"), TEXT("July"), TEXT("August"), TEXT("September"), TEXT("October"), TEXT("November"), TEXT("December")};
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT Msg,WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hMutex=CreateMutex(NULL,FALSE,TEXT("OnlyOneInstance_TextClock"));
if(hMutex==NULL || ERROR_ALREADY_EXISTS==GetLastError())return 0;
WNDCLASSEX m_WndClsEx;
m_WndClsEx.cbSize = sizeof(WNDCLASSEX);
m_WndClsEx.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
m_WndClsEx.lpfnWndProc = MainWndProc;
m_WndClsEx.cbClsExtra = 0;
m_WndClsEx.cbWndExtra = 0;
m_WndClsEx.hInstance = hInstance;
m_WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
m_WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
m_WndClsEx.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
m_WndClsEx.lpszMenuName = NULL;
m_WndClsEx.lpszClassName = ClsName;
m_WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&m_WndClsEx);
HWND hwnd=hwnd = CreateWindowEx (WS_EX_TOPMOST|WS_EX_TOOLWINDOW,
ClsName,WndName,WS_POPUPWINDOW,
0,0,1,1,
NULL, NULL, hInstance, NULL);
ShowWindow (hwnd,SW_SHOWNORMAL) ;
UpdateWindow (hwnd) ;
MSG Msg;
while( GetMessage(&Msg, NULL, 0, 0) )
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT Msg,WPARAM wParam, LPARAM lParam)
{
static SYSTEMTIME sysTime;
static TCHAR buffer[100];
static HDC hdc;
static PAINTSTRUCT ps;
static LOGFONT lf;
static HBRUSH hbr;
static HRGN hrgn;
static HFONT hf;
static TEXTMETRIC tm;
switch(Msg)
{
case WM_TIMER:
InvalidateRect(hwnd,NULL,FALSE);
return 0;
case WM_CREATE:
SetTimer(hwnd,WM_NULL,100,NULL);
return 0;
case WM_LBUTTONDOWN:
if( GetKeyState(VK_CONTROL)&0x80000000 )SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
return 0;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
GetTextMetrics(hdc,&tm);
memset(&lf,0,sizeof(lf));
lf.lfHeight=(tm.tmHeight+tm.tmExternalLeading)* 4;
lf.lfWidth=tm.tmAveCharWidth*3;
lf.lfWeight=FW_HEAVY;
//lf.lfItalic=TRUE;
//lf.lfUnderline=FALSE;
TCHAR *FontFaceName=TEXT("Monotype Corsiva");//TEXT("Monotype Corsiva")TEXT("Lucida Console"))TEXT("Fixedsys")TEXT("Verdana"))TEXT("DotumChe")TEXT("Arial Black"))TEXT("幼圆")
lstrcpy(lf.lfFaceName,FontFaceName);
memset(&sysTime,0,sizeof(sysTime));
GetLocalTime(&sysTime);
TCHAR *timeFormat=TEXT("%s %02ld,%ld[%s]%02ld:%02ld.%02ld");
wsprintf(buffer,timeFormat,
lpszMonthOfYear[sysTime.wMonth-1]/*January在序号0*/,sysTime.wDay,sysTime.wYear,
lpszDayOfWeek[sysTime.wDayOfWeek]/*Sunday在序号0*/,
sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
hf=CreateFontIndirect(&lf);//+font(创建)
SelectObject(hdc,hf);// =font(使用)
RECT rectDesktop;
SystemParametersInfo(SPI_GETWORKAREA,0,&rectDesktop,0);
SIZE czStr;
GetTextExtentPoint32(hdc,buffer,lstrlen(buffer),&czStr);//根据字符串字体取得显示的宽度和亮度,然后用于首次显示调整窗体位置和大小
if(bAdjustWindow)
{
MoveWindow( hwnd, GetSystemMetrics(SM_CXFULLSCREEN)-czStr.cx-25,//微调
rectDesktop.bottom-czStr.cy,//rectDesktop.bottom是系统状态栏最高处的纵坐标
czStr.cx+20,
czStr.cy,
TRUE);
bAdjustWindow=false;
}
SetBkMode(hdc,TRANSPARENT);
BeginPath(hdc);
TextOut(hdc,0,0,buffer,lstrlen(buffer));
EndPath(hdc);
hrgn=PathToRegion(hdc);// +hrgn
hbr=CreateSolidBrush(TEXTCOLOR);//+Brush
FillRgn(hdc,hrgn,hbr);//=Brush
SetWindowRgn(hwnd,hrgn,TRUE);//=-hrgn(使用并删除)
DeleteObject(hbr);//-Brush
DeleteObject(hf);//-font(删除)
EndPaint(hwnd,&ps);
}
return 0;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE) PostQuitMessage(WM_QUIT);
return 0;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(WM_QUIT);
return 0;
}
return DefWindowProc(hwnd, Msg, wParam, lParam);
}
#include <windows.h>
#include "tchar.h"
#include <stdio.h>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"gdi32.lib")
#define TEXTCOLOR (RGB(189,85,178))
bool bAdjustWindow=TRUE;
TCHAR * ClsName =TEXT("class_TextClock");
TCHAR * WndName = TEXT("window_TextClock");
TCHAR * lpszDayOfWeek[]= { TEXT("Sunday"),TEXT("Monday"),TEXT("Tuesday"),TEXT("Wednesday"),TEXT("Thursday"), TEXT("Friday"), TEXT("Saturday") };
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT Msg,WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hMutex=CreateMutex(NULL,FALSE,TEXT("OnlyOneInstance_TextClock"));
if(hMutex==NULL || ERROR_ALREADY_EXISTS==GetLastError())return 0;
WNDCLASSEX m_WndClsEx;
m_WndClsEx.cbSize = sizeof(WNDCLASSEX);
m_WndClsEx.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
m_WndClsEx.lpfnWndProc = MainWndProc;
m_WndClsEx.cbClsExtra = 0;
m_WndClsEx.cbWndExtra = 0;
m_WndClsEx.hInstance = hInstance;
m_WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
m_WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
m_WndClsEx.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
m_WndClsEx.lpszMenuName = NULL;
m_WndClsEx.lpszClassName = ClsName;
m_WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&m_WndClsEx);
HWND hwnd=hwnd = CreateWindowEx (WS_EX_TOPMOST|WS_EX_TOOLWINDOW,
ClsName,WndName,WS_POPUPWINDOW,
0,0,1,1,
NULL, NULL, hInstance, NULL);
ShowWindow (hwnd,SW_SHOWNORMAL) ;
UpdateWindow (hwnd) ;
MSG Msg;
while( GetMessage(&Msg, NULL, 0, 0) )
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT Msg,WPARAM wParam, LPARAM lParam)
{
static SYSTEMTIME sysTime;
static TCHAR buffer[100],*timeFormat=TEXT("%ld.%02ld.%02ld[%s]%02ld:%02ld.%02ld");
static HDC hdc;
static PAINTSTRUCT ps;
static LOGFONT lf;
static HBRUSH hbr;
static HRGN hrgn;
static HFONT hf;
static TEXTMETRIC tm;
switch(Msg)
{
case WM_TIMER:
InvalidateRect(hwnd,NULL,FALSE);
return 0;
case WM_CREATE:
SetTimer(hwnd,WM_NULL,100,NULL);
return 0;
case WM_LBUTTONDOWN:
SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
return 0;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
GetTextMetrics(hdc,&tm);
memset(&lf,0,sizeof(lf));
lf.lfHeight=(tm.tmHeight+tm.tmExternalLeading)*2;
lf.lfWidth=tm.tmAveCharWidth*2;
lf.lfWeight=FW_HEAVY;
//lf.lfItalic=TRUE;
//lf.lfUnderline=FALSE;
TCHAR *FontFaceName=TEXT("Fixedsys");//TEXT("Lucida Console"))TEXT("Fixedsys")TEXT("Verdana"))TEXT("DotumChe")TEXT("Arial Black"))TEXT("幼圆")
lstrcpy(lf.lfFaceName,FontFaceName);
memset(&sysTime,0,sizeof(sysTime));
GetLocalTime(&sysTime);
wsprintf(buffer,timeFormat,
sysTime.wYear,sysTime.wMonth,sysTime.wDay,
lpszDayOfWeek[sysTime.wDayOfWeek],
sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
hf=CreateFontIndirect(&lf);//+font(创建)
SelectObject(hdc,hf);// =font(使用)
RECT rectDesktop;
SystemParametersInfo(SPI_GETWORKAREA,0,&rectDesktop,0);
SIZE czStr;
GetTextExtentPoint32(hdc,buffer,lstrlen(buffer),&czStr);//根据字符串字体取得显示的宽度和亮度,然后用于首次显示调整窗体位置和大小
if(bAdjustWindow)
{
MoveWindow( hwnd, GetSystemMetrics(SM_CXFULLSCREEN)-czStr.cx-10,//+10和下面的-10是微调
rectDesktop.bottom-czStr.cy,//rectDesktop.bottom是系统状态栏最高处的纵坐标
czStr.cx+10,
czStr.cy,
TRUE);
bAdjustWindow=false;
}
SetBkMode(hdc,TRANSPARENT);
BeginPath(hdc);
TextOut(hdc,0,0,buffer,_tcslen(buffer));
EndPath(hdc);
hrgn=PathToRegion(hdc);// +hrgn
hbr=CreateSolidBrush(TEXTCOLOR);//+Brush
FillRgn(hdc,hrgn,hbr);//=Brush
SetWindowRgn(hwnd,hrgn,TRUE);//=-hrgn(使用并删除)
DeleteObject(hbr);//-Brush
DeleteObject(hf);//-font(删除)
EndPaint(hwnd,&ps);
}
return 0;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE) PostQuitMessage(WM_QUIT);
return 0;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(WM_QUIT);
return 0;
}
return DefWindowProc(hwnd, Msg, wParam, lParam);
}
#include <windows.h>
#include <time.h>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"gdi32.lib")
#pragma comment(lib,"kernel32.lib")
//
#define LENGTH 15//20//10//100//方块边长
#define DX 1//方块间横向间隔
#define DY 1//方块间纵向间隔
int cwidth=LENGTH*6+1+DX*5;//窗体的宽
int cheight=LENGTH*4+1+DY*3;//窗体的高
//
struct XTIME
{
int hour,minute,second;//时分秒
};
struct QUAD
{
RGBTRIPLE m_color;//方块色彩
bool m_bPaint;//是否显示
};
QUAD quad[6][4];//定义时间方格
//
void rand_color(void)//随机色彩
{
for(int m=0;m<6;m++)
{
for(int n=0;n<4;n++)
{
quad[m][n].m_color.rgbtRed=rand()%255;
quad[m][n].m_color.rgbtGreen=rand()%255;
quad[m][n].m_color.rgbtBlue=rand()%255;
}
}
}
void rand_color_hour(void)//随机色彩
{
for(int m=0;m<=1;m++)
{
for(int n=0;n<4;n++)
{
quad[m][n].m_color.rgbtRed=rand()%255;
quad[m][n].m_color.rgbtGreen=rand()%255;
quad[m][n].m_color.rgbtBlue=rand()%255;
}
}
}
void rand_color_minute(void)//随机色彩
{
for(int m=2;m<=3;m++)
{
for(int n=0;n<4;n++)
{
quad[m][n].m_color.rgbtRed=rand()%255;
quad[m][n].m_color.rgbtGreen=rand()%255;
quad[m][n].m_color.rgbtBlue=rand()%255;
}
}
}
void rand_color_second(void)//随机色彩
{
for(int m=4;m<=5;m++)
{
for(int n=0;n<4;n++)
{
quad[m][n].m_color.rgbtRed=rand()%255;
quad[m][n].m_color.rgbtGreen=rand()%255;
quad[m][n].m_color.rgbtBlue=rand()%255;
}
}
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
HANDLE hMutex=CreateMutex(NULL,FALSE,TEXT("Only One Instance"));
if( hMutex==NULL ||ERROR_ALREADY_EXISTS==GetLastError() ) return 0;
static char *szAppName = TEXT("binaryclock");
MSG msg;
HWND hwnd;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL,LPCTSTR(100));
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)CreateSolidBrush(RGB(255,255,255));
wndclass.lpszMenuName = 0;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = wndclass.hIcon;
RegisterClassEx (&wndclass);
hwnd = CreateWindowEx (WS_EX_TOPMOST|WS_EX_TOOLWINDOW,
szAppName,szAppName,WS_POPUPWINDOW,
GetSystemMetrics(SM_CXSCREEN)-cwidth-10,
GetSystemMetrics(SM_CYSCREEN)-cheight-40,cwidth, cheight,
NULL, NULL, hInstance, NULL);
ShowWindow (hwnd,SW_SHOWNORMAL);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static XTIME old_time,t0,t10;//old_time前一次时间,t0时间的个位,t10时间的十位
static SYSTEMTIME current_time;
static HBRUSH hb;
static HPEN hp;
static HDC hdc;
switch (uMsg)
{
case WM_CREATE :
{
srand( (unsigned)time( NULL ) );
memset(&quad,1,sizeof(quad));
memset(¤t_time,0,sizeof(current_time));
rand_color();
SetTimer(hwnd,WM_NULL,100,NULL);
GetLocalTime(¤t_time);
return 0;
}
case WM_TIMER://SetTimer()定时每隔100毫秒更新一次时间
{
//old_time.second,old_time.minute,old_time.hour是旧的时间
old_time.second=current_time.wSecond;
old_time.minute=current_time.wMinute;
old_time.hour=current_time.wHour;
GetLocalTime(¤t_time);//取得当前最新时间
if(old_time.minute!=current_time.wMinute)rand_color_minute();//分钟变化时改变分钟颜色
if(old_time.hour!=current_time.wHour)rand_color_hour();//小时变化时改变小时颜色
if( (old_time.second/10)!=(current_time.wSecond/10) )rand_color_second();//十秒钟变化时改变秒钟颜色
//s,m,h,ss,mm,hh,用于取得数值的模填入quad的m_bPaint中,为1者显示,为0者不显示
t0.second=current_time.wSecond%10; t10.second=current_time.wSecond/10;//秒钟:求余取得个位数字t0.second,求商取得十位字t10.second,下同
t0.minute=current_time.wMinute%10; t10.minute=current_time.wMinute/10;
t0.hour=current_time.wHour%10; t10.hour=current_time.wHour/10;
for(int n=0;n<4;n++)//按时间的数值,求与依次填入框格中
{
quad[5][3-n].m_bPaint=(t0.second>>n)&1;
quad[4][3-n].m_bPaint=(t10.second>>n)&1;
quad[3][3-n].m_bPaint=(t0.minute>>n)&1;
quad[2][3-n].m_bPaint=(t10.minute>>n)&1;
quad[1][3-n].m_bPaint=(t0.hour>>n)&1;
quad[0][3-n].m_bPaint=(t10.hour>>n)&1;
}
InvalidateRect(hwnd,NULL,0);//立即刷新整个窗口,即触发WM_PAINT 消息
break;
}
case WM_PAINT:
{
hdc=GetDC(hwnd);
for(int m=0;m<6;m++)
{
for(int n=0;n<4;n++)
{
if(quad[m][n].m_bPaint)//位为1的用彩色画刷
{
BYTE r,g,b;
r=quad[m][n].m_color.rgbtRed;
g=quad[m][n].m_color.rgbtGreen;
b=quad[m][n].m_color.rgbtBlue;
hb=CreateSolidBrush(RGB(r,g,b));
hp=CreatePen(PS_INSIDEFRAME,1,RGB(0,0,0));
}
else {//位为0的用白色画刷
hb=(HBRUSH)GetStockObject(WHITE_BRUSH);
//hp=CreatePen(PS_INSIDEFRAME,1,RGB(0,0,0));//黑
//hp=CreatePen(PS_INSIDEFRAME,1,RGB(255,255,255));//白
hp=CreatePen(PS_INSIDEFRAME,1,RGB(215,215,215));//灰色
}
SelectObject(hdc,hp);
SelectObject(hdc,hb);
Rectangle(hdc,m*(LENGTH+DX),n*(LENGTH+DY),m*(LENGTH+DX)+LENGTH,n*(LENGTH+DY)+LENGTH);
DeleteObject(hp);
DeleteObject(hb);
}
}
ReleaseDC(hwnd,hdc);
break;
}
case WM_LBUTTONDOWN://拖拽窗口
SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
return 0;
case WM_COMMAND :
break;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE) PostQuitMessage (0); //ESC键退出
break;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, uMsg, wParam, lParam);
}
转载地址:
http://blog.csdn.net/wisepragma/article/details/21327255