C++辅导:实现数字钟的另一种方法
1个回答
展开全部
前不久在VCKBASE网上看到一篇关于数字电子钟的程序,下来以后用了以后感觉很不错,做的相当漂亮。闲暇琢磨之余,发现了另外一种实现数字钟的方法,虽然效果没有前面那位同志好,但本着学习的态度我把我的想法发布一下。希望对大家有借鉴意义。
前面那位作者用的方法是在静态控件之上绘制数字,然后根据不同的数字在不同的区域上显示不同的颜色。这样作的难点在于如何精确计算不同的数字所对应的坐标和区域,而且一旦静态控件的大小比例不协调,所显示的数字有很大的变形。我的思路是用静态控件组成不同的数字,然后在显示数值时用不同的颜色填充数字以显示不同的数字。
最终效果图如下:
具体实现如下:
1.页面设计
把静态文本控件按数字显示格式排列,一个排列好的数字如图a所示。为了使控件的ID连续以方便函数处理,所设置显示每一个数字的控件ID是连续的,这样就可于用前一个控件的ID加减一个整数来得到下一个控件的ID.如图所示控件的ID顺序和控件所显示的数字一致。为了使界面更美观,给做好的控件加一个背景矩形控件,每次矩形所显示的颜色和控件的颜色不同,这样就可以给人一种动态逼真的感觉。
2.在工程中加入一个类CyColor,用于绘制静态文本控件的颜色。相应的成员函数和成员变量如下:
PaintStatic用来为绘制静态文本控件颜色,CWnd *dlg是控件的指针,在调用时用GetDlgItem(ID)获得指针。COLORREF cr是所选的颜色,CString str是需要显示的文字。
void MyColor::PaintStatic(CWnd *dlg,COLORREF cr,CString str)
{
CClientDC dc(dlg);
CRect rect;
dlg->GetClientRect(&rect);
CPen pen(PS_SOLID,1,RGB(50,0,10+100));
dc.SelectObject(&pen);
CBrush pBrush(cr);
dc.SelectObject(&pBrush);
dc.Rectangle(rect);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(rect.left+10,rect.top+5,str);
}
COLORREF成员变量c[10],用于存储颜色,我给它赋予10中个人比较喜爱的颜色;
3.在CClockDlg中加入MyColor型的成员变量mc,用于绘制静态控件的颜色
4.对显示数值进行编码,具体函数如下:
void CClockDlg::DrawHour(int n)//显示小时
{
//首先小时进行分解十位和各位
int a=n/10;//十位
int b=n%10;//个位
DrawNumber(IDC_STATIC1,a);//画十位
DrawNumber(IDC_STATIC8,a);//画个位
}
void CClockDlg::DrawMinute(int m)//显示分钟
{
//首先分钟进行分解十位和各位
int a=m/10;//十位
int b=m%10;//个位
DrawNumber(IDC_STATIC15,a);//画十位
DrawNumber(IDC_STATIC22,a);//画个位
}
void CClockDlg::DrawSecond(int s)//显示秒
{
//首先秒进行分解十位和各位
int a=s/10;//十位
int b=s%10;//个位
DrawNumber(IDC_STATIC29,a);//画十位
DrawNumber(IDC_STATIC36,a);//画个位
}
void CClockDlg::DrawDot()//画点
{
COLORREF C;
if(n%2==0)
C=mc.c[2];
else
C=mc.c[7];//n为奇数或偶数时,显示不同颜色,以产生闪动
mc.PaintStatic(GetDlgItem(IDC_STATIC43),C,"");
mc.PaintStatic(GetDlgItem(IDC_STATIC44),C,"");
mc.PaintStatic(GetDlgItem(IDC_STATIC45),C,"");
mc.PaintStatic(GetDlgItem(IDC_STATIC46),C,"");
}
void CClockDlg::DrawNumber(UINT nID,int n)
{
// DrawNumber(UINT nID,int n)函数的输入变量是控件的起始ID和所显示的数字,用途//////显示一个数字
if(n==0)
{
int dx[6]={1,2,3,5,6,7};//数值0所对应的静态控件序号,
for(int j=0;j
前面那位作者用的方法是在静态控件之上绘制数字,然后根据不同的数字在不同的区域上显示不同的颜色。这样作的难点在于如何精确计算不同的数字所对应的坐标和区域,而且一旦静态控件的大小比例不协调,所显示的数字有很大的变形。我的思路是用静态控件组成不同的数字,然后在显示数值时用不同的颜色填充数字以显示不同的数字。
最终效果图如下:
具体实现如下:
1.页面设计
把静态文本控件按数字显示格式排列,一个排列好的数字如图a所示。为了使控件的ID连续以方便函数处理,所设置显示每一个数字的控件ID是连续的,这样就可于用前一个控件的ID加减一个整数来得到下一个控件的ID.如图所示控件的ID顺序和控件所显示的数字一致。为了使界面更美观,给做好的控件加一个背景矩形控件,每次矩形所显示的颜色和控件的颜色不同,这样就可以给人一种动态逼真的感觉。
2.在工程中加入一个类CyColor,用于绘制静态文本控件的颜色。相应的成员函数和成员变量如下:
PaintStatic用来为绘制静态文本控件颜色,CWnd *dlg是控件的指针,在调用时用GetDlgItem(ID)获得指针。COLORREF cr是所选的颜色,CString str是需要显示的文字。
void MyColor::PaintStatic(CWnd *dlg,COLORREF cr,CString str)
{
CClientDC dc(dlg);
CRect rect;
dlg->GetClientRect(&rect);
CPen pen(PS_SOLID,1,RGB(50,0,10+100));
dc.SelectObject(&pen);
CBrush pBrush(cr);
dc.SelectObject(&pBrush);
dc.Rectangle(rect);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(rect.left+10,rect.top+5,str);
}
COLORREF成员变量c[10],用于存储颜色,我给它赋予10中个人比较喜爱的颜色;
3.在CClockDlg中加入MyColor型的成员变量mc,用于绘制静态控件的颜色
4.对显示数值进行编码,具体函数如下:
void CClockDlg::DrawHour(int n)//显示小时
{
//首先小时进行分解十位和各位
int a=n/10;//十位
int b=n%10;//个位
DrawNumber(IDC_STATIC1,a);//画十位
DrawNumber(IDC_STATIC8,a);//画个位
}
void CClockDlg::DrawMinute(int m)//显示分钟
{
//首先分钟进行分解十位和各位
int a=m/10;//十位
int b=m%10;//个位
DrawNumber(IDC_STATIC15,a);//画十位
DrawNumber(IDC_STATIC22,a);//画个位
}
void CClockDlg::DrawSecond(int s)//显示秒
{
//首先秒进行分解十位和各位
int a=s/10;//十位
int b=s%10;//个位
DrawNumber(IDC_STATIC29,a);//画十位
DrawNumber(IDC_STATIC36,a);//画个位
}
void CClockDlg::DrawDot()//画点
{
COLORREF C;
if(n%2==0)
C=mc.c[2];
else
C=mc.c[7];//n为奇数或偶数时,显示不同颜色,以产生闪动
mc.PaintStatic(GetDlgItem(IDC_STATIC43),C,"");
mc.PaintStatic(GetDlgItem(IDC_STATIC44),C,"");
mc.PaintStatic(GetDlgItem(IDC_STATIC45),C,"");
mc.PaintStatic(GetDlgItem(IDC_STATIC46),C,"");
}
void CClockDlg::DrawNumber(UINT nID,int n)
{
// DrawNumber(UINT nID,int n)函数的输入变量是控件的起始ID和所显示的数字,用途//////显示一个数字
if(n==0)
{
int dx[6]={1,2,3,5,6,7};//数值0所对应的静态控件序号,
for(int j=0;j
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询