📄 edclock.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(<m);
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 + -