好玩的Windows编程之"本地时间"


#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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值