⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wallclockst.cpp

📁 时钟程序
💻 CPP
字号:
// WallClockST.cpp : implementation file
//

#include "stdafx.h"
#include "AnalogClockDemo.h"
#include "WallClockST.h"
#include <afxwin.h>
#include <math.h>

#define SQUARESIZE			20
#define ID_TIMER_CLOCK		1

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// WallClockST

CWallClockST::CWallClockST()
{
	time = COleDateTime::GetCurrentTime ();
    m_nPrevSecond = time.GetSecond ();
    m_nPrevMinute = time.GetMinute ();
    m_nPrevHour = time.GetHour () % 12;
	sDate = time.Format("%d %b %Y");


    m_nSecond = time.GetSecond ();
    m_nMinute = time.GetMinute ();
    m_nHour = time.GetHour () % 12;

	m_nColor=RGB(0, 0, 0);
	m_dialClr = RGB(255,255,255);
	m_bkClr = RGB(81, 0, 0);
	m_tickClr = RGB(0, 0, 0);
	m_textClr = RGB(0, 0, 0);

	LoadColorSettings();
}

CWallClockST::~CWallClockST()
{
}


BEGIN_MESSAGE_MAP(CWallClockST, CStatic)
	//{{AFX_MSG_MAP(CWallClockST)
	ON_WM_TIMER()
	ON_WM_PAINT()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// WallClockST message handlers
BOOL bOnce = FALSE;
void CWallClockST::DrawClockFace (CDC* pDC)
{
	CRect rcDialog;
	GetClientRect(rcDialog);


	// This Creates area assigned to Dialog: This goes directly below the above in OnInitDialog
	if(m_rgn.m_hObject!=NULL)
		m_rgn.DeleteObject();

	m_rgn.CreateRoundRectRgn(0, 0, rcDialog.Width(), rcDialog.Height(),100,100);
	::SetWindowRgn(GetSafeHwnd(), (HRGN) m_rgn, TRUE);

	if(!bOnce)
		SetTimer(ID_TIMER_CLOCK,1000,NULL);
	
	static CPoint point[12] = {
        CPoint (   0,  450),    // 12 o'clock
        CPoint ( 225,  390),    //  1 o'clock
        CPoint ( 390,  225),    //  2 o'clock
        CPoint ( 450,    0),    //  3 o'clock
        CPoint ( 390, -225),    //  4 o'clock
        CPoint ( 225, -390),    //  5 o'clock
        CPoint (   0, -450),    //  6 o'clock
        CPoint (-225, -390),    //  7 o'clock
        CPoint (-390, -225),    //  8 o'clock
        CPoint (-450,    0),    //  9 o'clock
        CPoint (-390,  225),    // 10 o'clock
        CPoint (-225,  390),    // 11 o'clock
    };

    pDC->SelectStockObject (NULL_BRUSH);


	if(!bOnce)
	{
		CBrush mybrush(m_bkClr);
		pDC->SelectObject(&mybrush);
		pDC->RoundRect(-500,-500,500,500,100,100);
	}
	bOnce = TRUE;
	CBrush mybrush1(m_dialClr);
	pDC->SelectObject(&mybrush1);
	pDC->SetBkColor(m_dialClr);

	pDC->Ellipse(-450,-450,450,450);
	CString str="";
    CPen tickpen (PS_SOLID, 0, m_tickClr);
    CPen* pOldTickPen = pDC->SelectObject (&tickpen);
	for(int i=0;i<12;i++)
	{
		pDC->MoveTo(0,0);
		pDC->LineTo(point[i].x,point[i].y);
	}
	pDC->SelectObject(pOldTickPen);

    CPen pen (PS_SOLID, 0, m_dialClr);
    CPen* pOldPen = pDC->SelectObject (&pen);
	pDC->Ellipse(-400,-400,400,400);

	static CPoint point1[12] = {
        CPoint (   -25,  400),  // 12 o'clock
        CPoint ( 170,  340),    //  1 o'clock
        CPoint ( 290,  200),    //  2 o'clock
        CPoint ( 350,    28),    //  3 o'clock
        CPoint ( 300, -160),    //  4 o'clock
        CPoint ( 180, -270),    //  5 o'clock
        CPoint (  -10, -340),    //  6 o'clock
        CPoint (-180, -290),    //  7 o'clock
        CPoint (-320, -160),    //  8 o'clock
        CPoint (-380,    28),    //  9 o'clock
        CPoint (-340,  200),    // 10 o'clock
        CPoint (-200,  340),    // 11 o'clock
    };

	int val = 12;
	pDC->SetTextColor(m_textClr);
	for( i=0;i<12;i++)
	{
		str.Format("%d",val);

		val++;
		if(val>12)
			val=1;

		pDC->TextOut(point1[i].x,point1[i].y,str);
	}

	DrawDate(pDC,sDate,-200,-150,RGB(0,0,0));

}

void CWallClockST::DrawSecondHand (CDC* pDC, int nLength, int nScale, int nDegrees, COLORREF clrColor)
{
	CPoint point[2];
    double nRadians = (double) nDegrees * 0.017453292;

    point[0].x = (int) (nLength * sin (nRadians));
    point[0].y = (int) (nLength * cos (nRadians));

    point[1].x = -point[0].x / nScale;
    point[1].y = -point[0].y / nScale;

    CPen pen (PS_SOLID, 0, clrColor);
    CPen* pOldPen = pDC->SelectObject (&pen);

    pDC->MoveTo (point[0]);
    pDC->LineTo (point[1]);

    pDC->SelectObject (pOldPen);
}

void CWallClockST::DrawHand (CDC* pDC, int nLength, int nScale, int nDegrees, COLORREF clrColor)
{
	
	CPoint point[4];
    double nRadians = (double) nDegrees * 0.017453292;

    point[0].x = (int) (nLength * sin (nRadians));
    point[0].y = (int) (nLength * cos (nRadians));

    point[2].x = -point[0].x / nScale;
    point[2].y = -point[0].y / nScale;

    point[1].x = -point[2].y;
    point[1].y = point[2].x;

    point[3].x = -point[1].x;
    point[3].y = -point[1].y;

    CPen pen (PS_SOLID, 0, clrColor);
    CPen* pOldPen = pDC->SelectObject (&pen);

    pDC->MoveTo (point[0]);
    pDC->LineTo (point[1]);
    pDC->LineTo (point[2]);
    pDC->LineTo (point[3]);
    pDC->LineTo (point[0]);

	CRgn myrgn;
	myrgn.CreatePolygonRgn(point,4,ALTERNATE);
	CBrush mybrush(m_nColor);

	pDC->FillRgn(&myrgn,&mybrush);

    pDC->SelectObject (pOldPen);
}

void CWallClockST::OnPaint() 
{
	CRect rect;
    GetClientRect (&rect);

    CPaintDC dc (this);
    dc.SetMapMode (MM_ISOTROPIC);
    dc.SetWindowExt (1000, 1000);
    dc.SetViewportExt (rect.Width (), -rect.Height ());
    dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);

    DrawClockFace (&dc);
    DrawHand (&dc, 275, 8, (m_nPrevHour * 30) +
        (m_nPrevMinute / 2), m_nColor);
    DrawHand (&dc, 400, 16, m_nPrevMinute * 6, m_nColor);
    DrawSecondHand (&dc, 400, 8, m_nPrevSecond * 6, m_nColor);
	bOnce = FALSE;
}

void CWallClockST::OnTimer(UINT nIDEvent) 
{
	time = COleDateTime::GetCurrentTime();

    int nSecond = time.GetSecond ();
    int nMinute = time.GetMinute ();
    int nHour = time.GetHour () % 12;

	sDate = time.Format("%d %b %Y");


    if ((nSecond == m_nPrevSecond) &&
        (nMinute == m_nPrevMinute) &&
        (nHour == m_nPrevHour))
        return;

    //
    // Center the origin and switch to the MM_ISOTROPIC mapping mode.
    //
    CRect rect;
    GetClientRect (&rect);

    CClientDC dc (this);
    dc.SetMapMode (MM_ISOTROPIC);
    dc.SetWindowExt (1000, 1000);
    dc.SetViewportExt (rect.Width (), -rect.Height ());
    dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
    //
    // If minutes have changed, erase the hour and minute hands.
    //
    COLORREF clrColor = ::GetSysColor (COLOR_3DFACE);

	clrColor = m_dialClr;

    if (nHour != m_nPrevHour)
	{
	    DrawHand (&dc, 275, 8, (m_nPrevHour * 30) + (m_nPrevMinute / 2), clrColor);
		m_nPrevHour=nHour;
	}
	
	if (nMinute != m_nPrevMinute) 
	{
        DrawHand (&dc, 275, 8, (m_nPrevHour * 30) + (m_nPrevMinute / 2),
            clrColor);
        DrawHand (&dc, 400, 16, m_nPrevMinute * 6, clrColor);
        m_nPrevMinute = nMinute;
        m_nPrevHour = nHour;
    }

    //
    // If seconds have changed, erase the second hand and redraw all hands.
    //
    if (nSecond != m_nPrevSecond) 
	{
        DrawSecondHand (&dc, 400, 8, m_nPrevSecond * 6, clrColor);
        DrawSecondHand (&dc, 400, 8, nSecond * 6, m_nColor);
        DrawHand (&dc, 200, 8, (nHour * 30) + (nMinute / 2),
            m_nColor);
        DrawHand (&dc, 400, 16, nMinute * 6, m_nColor);
        m_nPrevSecond = nSecond;
    }

	Invalidate();

	CStatic::OnTimer(nIDEvent);
}

void CWallClockST::OnClose() 
{
	KillTimer (ID_TIMER_CLOCK);
	CStatic::OnClose();
}

//Function to set hand color of the clock
void CWallClockST::SetHandColor(COLORREF color)
{
	m_nColor=color;
	SaveColorSettings();
	Invalidate();
}

//Function to retrieve hand color of the clock
COLORREF CWallClockST::GetHandColor()
{
	return m_nColor;
}

//Function to retrieve dial color of the clock
COLORREF CWallClockST::GetDialColor()
{
	return m_dialClr;
}

//Function to set dial color of the clock
void CWallClockST::SetDialColor(COLORREF color)
{
	m_dialClr=color;
	SaveColorSettings();
	Invalidate();
}

//Function to set tick color of the clock
void CWallClockST::SetTickColor(COLORREF color)
{
	m_tickClr=color;
	SaveColorSettings();
	Invalidate();
}

//Function to retrieve tick color of the clock
COLORREF CWallClockST::GetTickColor()
{
	return m_tickClr;
}

//Function to retrieve text color of the clock
COLORREF CWallClockST::GetTextColor()
{
	return m_textClr;
}

//Function to set text color of the clock
void CWallClockST::SetTextColor(COLORREF color)
{
	m_textClr=color;
	SaveColorSettings();
	Invalidate();
}

//Function to show date color of the clock
void CWallClockST::DrawDate(CDC *pDC, CString str, int x, int y, COLORREF color)
{
	pDC->SetBkColor(color);
	pDC->SetTextColor(RGB(255,255,255));

	pDC->TextOut(x,y,str);

}

//Function to set date/time of the clock
void CWallClockST::SetDateTime(COleDateTime dt)
{
	m_PrevDate = COleDateTime::GetCurrentTime();
	SYSTEMTIME st;
	dt.GetAsSystemTime(st);
	SetLocalTime(&st);

	Invalidate();
}

//Function to retrieve default date/time settings of the clock
void CWallClockST::ResetDate()
{
	SYSTEMTIME st;
	m_PrevDate.GetAsSystemTime(st);
	SetLocalTime(&st);
	Invalidate();
}

// Restarts the clock.
void CWallClockST::StartClock()
{
	SetTimer(ID_TIMER_CLOCK,1000,NULL);
}

//Stops the clock
void CWallClockST::StopClock()
{
	KillTimer(ID_TIMER_CLOCK);
}

// Function to save clock settings to the PC.
// The clock settings will be saved as a .sys file
// in the user's system directory.
void CWallClockST::SaveColorSettings()
{
	FILE *fp;
	char sPath[512];

	GetSystemDirectory(sPath,512);

	sprintf(sPath,"%s\\clkstng.sys",sPath);
	fp = fopen(sPath,"w");
	char encstr[512] = "";
	char temp[512] = "";

	char str[512];
	sprintf(str,"!%ld|%ld|%ld|%ld|%d@",m_bkClr,m_dialClr,m_nColor,m_tickClr,m_textClr);
	int i,j;

	for(i=0,j=strlen(str)-1;j>=0;i++,j--)
	{
		encstr[i] = str[j];
	}
	encstr[i] = '\0';

	for(i=0;i<(int)strlen(encstr);i++)
	{
		sprintf(temp,"%s%d#!@",temp,encstr[i]+2);
	}

	sprintf(encstr,"%s",temp);

	fprintf(fp,"%s",encstr);
	fclose(fp);
	
}

// Function to load clock settings to the PC.
void CWallClockST::LoadColorSettings()
{
	char str[512];
	char sPath[512];
	FILE *fp;

	GetSystemDirectory(sPath,512);

	sprintf(sPath,"%s\\clkstng.sys",sPath);
	fp = fopen(sPath,"r");

	if(fp==NULL)
	{
		SaveColorSettings();
		return;
	}

	fscanf(fp,"%s",str);

	fclose(fp);

	char decstr[255] = "";
	char temp[255] = "";
	char *res;
	int pos=0,len;
	int i,j;

	len = strlen(str);
	while(strcmp(str,"")!=0)
	{
		res = strstr(str,"#!@");
		pos = res - str + 1;
		strncpy(temp,str,pos-1);
		temp[pos-1]='\0';
		sprintf(decstr,"%s%c",decstr,atoi(temp)-2);
		sprintf(str,"");
		sprintf(temp,"");
		sprintf(str,"%s",res+3);
	}

	for(i=0,j=strlen(decstr)-1;j>=0;i++,j--)
	{
		temp[i] = decstr[j];
	}

	CString sData = temp;

	/* Background Color */
	pos = sData.Find("|",0);
	CString sTemp = sData.Mid(1,pos-1);
	m_bkClr = atol(sTemp.GetBuffer(sTemp.GetLength()));

	sData = sData.Right(sData.GetLength()-pos-1);

	/* Dial Color */
	pos = sData.Find("|",0);
	sTemp = sData.Mid(0,pos);
	m_dialClr = atol(sTemp.GetBuffer(sTemp.GetLength()));

	sData = sData.Right(sData.GetLength()-pos-1);

	/* Hand Color */
	pos = sData.Find("|",0);
	sTemp = sData.Mid(0,pos);
	m_nColor = atol(sTemp.GetBuffer(sTemp.GetLength()));

	sData = sData.Right(sData.GetLength()-pos-1);

	/* Tick Color */
	pos = sData.Find("|",0);
	sTemp = sData.Mid(0,pos);
	m_tickClr = atol(sTemp.GetBuffer(sTemp.GetLength()));

	sData = sData.Right(sData.GetLength()-pos-1);

	/* Text Color */
	pos = sData.Find("|",0);
	sTemp = sData.Mid(0,pos);
	m_textClr = atol(sTemp.GetBuffer(sTemp.GetLength()));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -