好玩的Windows编程之"本地时间"(2)TextClock

新版本: (下载页面)

//程序名:文本时钟/TextClock  
//作者wisepragma  
//主页:http://blog.csdn.net/wisepragma  
//taskkill /im textclock.exe
//cl textclock.cpp /W3
//start textclock.exe 


#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);
}



旧版本:


//程序名:文本时钟/TextClock  
//作者wisepragma  
//主页:http://blog.csdn.net/wisepragma  
//taskkill /im TextClock.exe 
//cl TextClock.CPP /W3
//start TextClock.exe
#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);
}



转载于:https://my.oschina.net/u/160145/blog/264394

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值