偶然的一次机会看到了这个小小的控件,想必大家都知道该如何利用它了吧。o(∩_∩)o...
/**/
///
#ifndef __MFC_EXT_DIGITCLOCK_H__
#define
__MFC_EXT_DIGITCLOCK_H__
//
EDClock.h : header file
//
#define
IntegerCount 3
#define
DecimalCount 5
//
4
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CDigitDisplayer window
class
CDigitDisplayer :
public
CStatic
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// Construction
public:
CDigitDisplayer();
virtual ~CDigitDisplayer();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Attributes
public:
static COLORREF origin;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Operations
public:
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
COLORREF GetColor() const ...{ return m_color;}
COLORREF SetColor(COLORREF color);
double m_number;
void DisplayDigit(double number);
void GetDigit(double number);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDigitDisplayer)
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Implementation
public:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Generated message map functions
protected:
//{{AFX_MSG(CDigitDisplayer)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
private:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
COLORREF m_color;
UINT m_w;
UINT m_h;
BITMAP m_bm;
HBITMAP m_hBitmap[13];
UINT m_nTimer;
int m_digit[10];
void Output(UINT digit, UINT pos);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
DECLARE_MESSAGE_MAP()
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
{{AFX_INSERT_LOCATION}}
//
Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif
//
__MFC_EXT_DIGITCLOCK_H__
//
//
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
//
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
There are three properties.
//
face color <-----> SetColor();
//
style <-----> SetStyle();
//
alarm mode <----> SetAlarm();
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
//
//
EDClock.cpp : implementation file
//
数码管显示
#include
"
stdafx.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#include
"
resource.h
"
#include
"
DigitDisplayer.h
"
#include
"
math.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#ifdef _DEBUG
#define
new DEBUG_NEW
#undef
THIS_FILE
static
char
THIS_FILE[]
=
__FILE__;
#endif
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
The resource bitmap face color
//
static COLORREF origin;
COLORREF CDigitDisplayer::origin
=
RGB(
255
,
0
,
0
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CDigitDisplayer
CDigitDisplayer::CDigitDisplayer()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
m_color = origin;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = 0; i< 13; i++) ...{//创建数码显示的位图
HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, i+IDB_BITMAP1, 0, NULL, 0);//创建合适的位图
m_hBitmap[i] = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);//将位图存入缓存以备显示
}
for(i=0;i<8;i++) m_digit[i]=0;
m_number=0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
CDigitDisplayer::
~
CDigitDisplayer()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = 0; i< 12; i++) ...{
if(m_hBitmap[i])
::DeleteObject(m_hBitmap[i]);//清空缓存
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BEGIN_MESSAGE_MAP(CDigitDisplayer, CStatic)
//
{{AFX_MSG_MAP(CDigitDisplayer)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_SIZE()
//
}}AFX_MSG_MAP
END_MESSAGE_MAP()
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CDigitDisplayer message handlers
void
CDigitDisplayer::PreSubclassWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
::GetObject(m_hBitmap[0], sizeof BITMAP, &m_bm);
CStatic::PreSubclassWindow();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CDigitDisplayer::OnPaint()
//
设置数码宽度和高度
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CPaintDC dc(this); // device context for painting
CRect rectClient;
GetClientRect(&rectClient);
m_h = rectClient.Height();
m_w = rectClient.Width()/(IntegerCount+DecimalCount+2);
DisplayDigit(m_number);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CDigitDisplayer::OnEraseBkgnd(CDC
*
pDC)
//
给数码显示准备无效区域
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your message handler code here and/or call default
CBrush brush;
brush.CreateSolidBrush(::GetSysColor(COLOR_WINDOWTEXT) );
CBrush* pOldBrush = pDC->SelectObject(&brush);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CRect rectClient;
GetClientRect(&rectClient);
pDC->PatBlt(0, 0, rectClient.Width(), rectClient.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return CStatic::OnEraseBkgnd(pDC);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CDigitDisplayer::Output(UINT digit, UINT pos)
//
数字输出
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// draw the bitmap
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
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();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
COLORREF CDigitDisplayer::SetColor(COLORREF color)
//
显示数字的颜色设置,若是红色,则改为显示时的绿色。
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(m_color == color)
return color;
COLORREF temp = m_color;
m_color = color;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = 0; i< 13; i++) ...{
if(m_hBitmap[i])
::DeleteObject(m_hBitmap[i]);
COLORMAP mapColor;
mapColor.from = origin;
mapColor.to = color;
HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, i+IDB_BITMAP1, 0, &mapColor, 1);
m_hBitmap[i] = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);
}
return temp;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CDigitDisplayer::GetDigit(
double
number)
//
获取每一位数字
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//最多显示4位整数,4位小数,1个小数点,1个符号
m_digit[0]=number/1000; //第一位整数
m_digit[1]=(number-m_digit[0]*1000)/100; //第二位整数
m_digit[2]=(number-m_digit[0]*1000-m_digit[1]*100)/10; //第三位整数
m_digit[3]=number-m_digit[0]*1000-m_digit[1]*100-m_digit[2]*10; //第四位整数
m_digit[4]=(number-m_digit[0]*1000-m_digit[1]*100-m_digit[2]*10-m_digit[3])*10; //第一位小数
m_digit[5]=(number-m_digit[0]*1000-m_digit[1]*100-m_digit[2]*10-m_digit[3])*100-m_digit[4]*10; //第二位小数
m_digit[6]=(number-m_digit[0]*1000-m_digit[1]*100-m_digit[2]*10-m_digit[3])*1000-m_digit[4]*100-m_digit[5]*10; //第三位小数
m_digit[7]=(number-m_digit[0]*1000-m_digit[1]*100-m_digit[2]*10-m_digit[3])*10000-m_digit[4]*1000-m_digit[5]*100-m_digit[6]*10; //第四位小数
m_digit[8]=(number-m_digit[0]*1000-m_digit[1]*100-m_digit[2]*10-m_digit[3])*100000-m_digit[4]*10000-m_digit[5]*1000-m_digit[6]*100-m_digit[7]*10; //第五位小数
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CDigitDisplayer::DisplayDigit(
double
number)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//*CRect rectClient;
GetClientRect(&rectClient);
m_h = rectClient.Height();
m_w = rectClient.Width()/(IntegerCount+DecimalCount+2);
*/
//得到各个数码位
GetDigit(fabs(number));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//显示符号
if(number>0) Output(12, 0); //空位图
else Output(11,0); //负号
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//显示小数点前的各数码位
int firstpositive;
firstpositive=3;
for(int i=4-IntegerCount;i<4;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(m_digit[i]>0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
firstpositive=i;
break;
}
}
for(i=4-IntegerCount;i<4;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(i>=firstpositive)
Output(m_digit[i],i-3+IntegerCount);
else
Output(12, i-3+IntegerCount);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//显示小数点
Output(10,IntegerCount+1);
//显示小数点后的各数码位
for(i=IntegerCount+1;i<IntegerCount+1+DecimalCount;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Output(m_digit[i],i+1);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CDigitDisplayer::OnSize(UINT nType,
int
cx,
int
cy)
//
保存当前窗口宽和高,以便后面能用GetWindowHeight和GetWindowWidth得到
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CStatic::OnSize(nType, cx, cy);
CRect rectClient;
GetClientRect(&rectClient);
m_h = rectClient.Height();
m_w = rectClient.Width()/(IntegerCount+DecimalCount+2);
}
在BITMAP中加入数码管资源即可实现