DIGCLOCK.docx
《DIGCLOCK.docx》由会员分享,可在线阅读,更多相关《DIGCLOCK.docx(5页珍藏版)》请在冰豆网上搜索。
DIGCLOCK
/*-----------------------------------------
DIGCLOCK.c--DigitalClock
(c)CharlesPetzold,1998
-----------------------------------------*/
#include
#defineID_TIMER1
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
PSTRszCmdLine,intiCmdShow)
{
staticTCHARszAppName[]=TEXT("DigClock");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!
RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ProgramrequiresWindowsNT!
"),
szAppName,MB_ICONERROR);
return0;
}
hwnd=CreateWindow(szAppName,TEXT("DigitalClock"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;
}
voidDisplayDigit(HDChdc,intiNumber)
{
staticBOOLfSevenSegment[10][7]={
1,1,1,0,1,1,1,//0
0,0,1,0,0,1,0,//1
1,0,1,1,1,0,1,//2
1,0,1,1,0,1,1,//3
0,1,1,1,0,1,0,//4
1,1,0,1,0,1,1,//5
1,1,0,1,1,1,1,//6
1,0,1,0,0,1,0,//7
1,1,1,1,1,1,1,//8
1,1,1,1,0,1,1};//9
staticPOINTptSegment[7][6]={
7,6,11,2,31,2,35,6,31,10,11,10,
6,7,10,11,10,31,6,35,2,31,2,11,
36,7,40,11,40,31,36,35,32,31,32,11,
7,36,11,32,31,32,35,36,31,40,11,40,
6,37,10,41,10,61,6,65,2,61,2,41,
36,37,40,41,40,61,36,65,32,61,32,41,
7,66,11,62,31,62,35,66,31,70,11,70};
intiSeg;
for(iSeg=0;iSeg<7;iSeg++)
if(fSevenSegment[iNumber][iSeg])
Polygon(hdc,ptSegment[iSeg],6);
}
voidDisplayTwoDigits(HDChdc,intiNumber,BOOLfSuppress)
{
if(!
fSuppress||(iNumber/10!
=0))
DisplayDigit(hdc,iNumber/10);
OffsetWindowOrgEx(hdc,-42,0,NULL);
DisplayDigit(hdc,iNumber%10);
OffsetWindowOrgEx(hdc,-42,0,NULL);
}
voidDisplayColon(HDChdc)
{
POINTptColon[2][4]={2,21,6,17,10,21,6,25,
2,51,6,47,10,51,6,55};
Polygon(hdc,ptColon[0],4);
Polygon(hdc,ptColon[1],4);
OffsetWindowOrgEx(hdc,-12,0,NULL);
}
voidDisplayTime(HDChdc,BOOLf24Hour,BOOLfSuppress)
{
SYSTEMTIMEst;
GetLocalTime(&st);
if(f24Hour)
DisplayTwoDigits(hdc,st.wHour,fSuppress);
else
DisplayTwoDigits(hdc,(st.wHour%=12)?
st.wHour:
12,fSuppress);
DisplayColon(hdc);
DisplayTwoDigits(hdc,st.wMinute,FALSE);
DisplayColon(hdc);
DisplayTwoDigits(hdc,st.wSecond,FALSE);
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
staticBOOLf24Hour,fSuppress;
staticHBRUSHhBrushRed;
staticintcxClient,cyClient;
HDChdc;
PAINTSTRUCTps;
TCHARszBuffer[2];
switch(message)
{
caseWM_CREATE:
hBrushRed=CreateSolidBrush(RGB(255,0,0));
SetTimer(hwnd,ID_TIMER,1000,NULL);
//fallthrough
caseWM_SETTINGCHANGE:
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_ITIME,szBuffer,2);
f24Hour=(szBuffer[0]=='1');
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_ITLZERO,szBuffer,2);
fSuppress=(szBuffer[0]=='0');
InvalidateRect(hwnd,NULL,TRUE);
return0;
caseWM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
return0;
caseWM_TIMER:
InvalidateRect(hwnd,NULL,TRUE);
return0;
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,276,72,NULL);
SetViewportExtEx(hdc,cxClient,cyClient,NULL);
SetWindowOrgEx(hdc,138,36,NULL);
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
SelectObject(hdc,GetStockObject(NULL_PEN));
SelectObject(hdc,hBrushRed);
DisplayTime(hdc,f24Hour,fSuppress);
EndPaint(hwnd,&ps);
return0;
caseWM_DESTROY:
KillTimer(hwnd,ID_TIMER);
DeleteObject(hBrushRed);
PostQuitMessage(0);
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}