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

📄 edclock.cpp

📁 时钟显示,加载图片显示数码管形式的时间.只能同时显示一个
💻 CPP
字号:
//
// Author: Xie Jingwei, Chinese Spell: 谢敬伟
// Email to me, jw_xie@usa.net
// A digital clock control, :-)
//

//
// Usage: See the header, just simple 
// Please Note: Make sure ADD the 12 bitmaps to your project, and 
// sort the ID to correct order. I used IDB_BITMAP1 to IDB_BITMAP12 
// side by side. See following:
//
// Digit:     ID				VALUE
//   0        IDB_BITMAP1		 100
//   1        IDB_BITMAP2		 101	
//   2        IDB_BITMAP3		 102	
//   3        IDB_BITMAP4		 103	
//   4        IDB_BITMAP5		 104
//   5        IDB_BITMAP6		 105	
//   6        IDB_BITMAP7		 106	
//   7        IDB_BITMAP8		 107
//   8        IDB_BITMAP9		 108
//   9        IDB_BITMAP10		 109	
//   :        IDB_BITMAP11		 110
//            IDB_BITMAP12		 111	
//

// There are three properties.
// style <-----> SetStyle();
// alarm mode <----> SetAlarm();



// EDClock.cpp : implementation file
//

#include "stdafx.h"

#include "resource.h"
#include "EDClock.h"

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

// The resource bitmap face color 
//static COLORREF origin; 

/////////////////////////////////////////////////////////////////////////////
// CDigitClock

CDigitClock::CDigitClock()
{
	m_bAlarm = FALSE;
	m_style = XDC_NOSECOND;
	//加载时钟图片
	m_hBitmap[0] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_0),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[1] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_1),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[2] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_2),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[3] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_3),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[4] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_4),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[5] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_5),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[6] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_6),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[7] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_7),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[8] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_8),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[9] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_9),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[10] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_POINT),IMAGE_BITMAP, 0, 0, 0);
	m_hBitmap[11] = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP_CLOCK_BLACK),IMAGE_BITMAP, 0, 0, 0);
	
}

CDigitClock::~CDigitClock()
{
	for(int i = 0; i< 12; i++) 
	{
		if(m_hBitmap[i])
		{
			::DeleteObject(m_hBitmap[i]);
		}
	}
}


BEGIN_MESSAGE_MAP(CDigitClock, CStatic)
	//{{AFX_MSG_MAP(CDigitClock)
	ON_WM_TIMER()
	ON_WM_DESTROY()
//	ON_WM_ERASEBKGND()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDigitClock message handlers

void CDigitClock::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	//
	// Note: Set the Timer here Pls. 
	// Dont set timer in OnCreate(), you cant recieve WM_CREATE 
	// when control construted in Dialog template. Say: OnCreate not called.
	//
	m_nTimer = SetTimer(1, 1000, NULL);
	::GetObject(m_hBitmap[0], sizeof BITMAP, &m_bm);
	
	CStatic::PreSubclassWindow();
}

void CDigitClock::OnDestroy() 
{
	CStatic::OnDestroy();
	
	// TODO: Add your message handler code here
	KillTimer(m_nTimer);	
}

void CDigitClock::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	
	// Do not call CStatic::OnPaint() for painting messages
}

BOOL CDigitClock::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	CBrush brush;
	brush.CreateSolidBrush( ::GetSysColor(COLOR_WINDOWTEXT) ); 
	CBrush* pOldBrush = pDC->SelectObject(&brush);

	CRect rectClient;
	GetClientRect(&rectClient);
	pDC->PatBlt(0, 0, rectClient.Width(), rectClient.Height(), PATCOPY);
	pDC->SelectObject(pOldBrush);
	
	return CStatic::OnEraseBkgnd(pDC);
}

void CDigitClock::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent == m_nTimer) 
	{
		m_nCount++;
		CRect rectClient;
		GetClientRect(&rectClient);
		m_h = rectClient.Height();
		if(m_style == XDC_SECOND) 
		{
			m_w = rectClient.Width()/8;
		}else 
		{
			m_w = rectClient.Width()/5;
		}

		SYSTEMTIME ltm;
		GetLocalTime(&ltm);
		COleDateTime time = ltm;

		int nh1 = time.GetHour()/10;
		if(nh1)
		{
			Output(nh1, 0);
		}else 
		{
			Output(11, 0);
		}
		int nh2 = time.GetHour()%10;
		Output(nh2, 1);
		int nm1 = time.GetMinute()/10;
		Output(nm1, 3);
		int nm2 = time.GetMinute()%10;
		Output(nm2, 4);

		switch(m_style) 
		{
		case XDC_SECOND:
			{
				int ns1 = time.GetSecond()/10;
				Output(ns1, 6);
				int s2 = time.GetSecond()%10;
				Output(s2, 7);
				Output(10, 2); // double points
				Output(10, 5); // double points
				
				break;
			}			
		case XDC_NOSECOND:				
		default:
			{
				if(m_bAlarm)
				{
					Output(10, 2);
				}else 
				{
					if(m_nCount%2)
					{
						Output(10, 2); // double points
					}else 
					{
						Output(11, 2); // 
					}
				}
				break;
			}
		}
		//
		if(m_bAlarm)
		{
			MessageBeep(-1);
		}
	}
	//
	CStatic::OnTimer(nIDEvent);
}

void CDigitClock::Output(UINT digit, UINT pos)
{
    // draw the bitmap
	CClientDC dc(this);
	CDC dcMem;
	dcMem.CreateCompatibleDC(&dc);
	// 
	// Alarm mode 
	// 
	if(m_bAlarm && m_nCount%2) 
	{
		digit = 11;
	}
	CBitmap* pBitmap = CBitmap::FromHandle( m_hBitmap[digit] );
	CBitmap* pOldBitmap = dcMem.SelectObject(pBitmap);
    dc.StretchBlt(m_w*pos, 0, m_w, m_h,
			&dcMem, 0, 0, m_bm.bmWidth, m_bm.bmHeight, SRCCOPY);
 	dcMem.SelectObject(pOldBitmap);
	dcMem.DeleteDC();
}


CDigitClock::CClockStyle CDigitClock::SetStyle(CClockStyle style)
{
	CClockStyle temp = m_style;
	m_style = style;
//	if(::IsWindow(m_hWnd))
//		Invalidate();
	return temp;
}

BOOL CDigitClock::SetAlarm(BOOL bAlarm /*= TRUE*/)
{
	BOOL temp = m_bAlarm;
	m_bAlarm = bAlarm;
	return temp;
}


⌨️ 快捷键说明

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