正文
要使用该类,需要在工程中加入DigitalDevice.h和DigitalDevice.cpp两个文件。并在要使用该类的类的头文件上加上#include “DigitalDevice.h”这句话。
一、类的介绍
该类从CStatic类派生,实际上是一个完整的子窗口。它可以仿真任意位数的数码管显示屏,能显示数字0~9,负号,冒号和小数点。它有两种工作方式:DD_STRING(字符串方式)或者是DD_NUMBER(数值方式)。当采用数值方式时,用户能调用DD_SetCurrentNumber(double num)函数来设置数码屏幕要显示的数值,可以显示数字、小数点和负号;当采用字符串模式时,用户能够调用DD_SetCurrentString(CString string)函数来设置要显示的字符串,除了能显示数字、小数点和负号外,还能显示冒号和空格,这很适合用来显示一个时钟,实际上,当将仪表设置成DD_STRING方式并且处于自检状态时,仪表就是一个精确到秒的时钟。要设置仪表的工作方式,应该调用DD_SetWorkMode(UINT mode)函数,mode的取值只能是DD_NUMBER或者DD_STRING。
可以用DD_SetBits(UINT bits)函数动态的设定数码屏幕的显示位数,应该确保数码屏幕的尺寸能够显示这些位,否则过多的位会被裁剪。设置数码屏幕的尺寸可以用DD_SetSize(UINT width, UINT height)函数。每个显示位的样式可以用DD_SetTextStyle(UINT charwidth, UINT charheight, UINT charthick, UINT charspace)函数来设置,其中的charwidth是字符宽度,charheight是字符高度,charthick是字符笔划的宽度,charspace是字符之间的间距。DD_SetTextPos(int x, int y)函数能设置字符相对于显示屏左上角的位置。
仪表具有以下几种状态:
DD_TEST:仪表的自检状态,数字会自动变化,在DD_STRING方式下是一个时钟
DD_WORK:仪表的工作状态,也是创建时的默认状态,等待数值或字符串的变化
DD_SHUTDOWN:仪表的关闭状态,不作任何动作
可以调用DD_SetStatus(UINT status)函数使仪表在上述状态中切换。
DD_SetBdColor(COLORREF lightcolor, COLORREF darkcolor)函数可以设置仪表的3D边框的颜色,参数lightcolor为边框亮部的颜色,darkcolor为边框暗部的颜色。DD_SetBorderWidth(UINT width)函数可以设置边框的线宽。DD_SetBorderStyle(UINT left, UINT top, UINT right, UINT bottom)函数可以设置边框的样式,各参数分别决定左、上、右、下边框是否显示,为1则显示,0则不显示。将部分边框设置成不显示往往是用于显示屏的组合。下图显示了一个显示屏组合的例子,三个显示屏通过调整位置和个别边界的显示与否,在外观上组合起来,就像一个显示屏一样。
DD_SetBkColor(COLORREF color)函数可以设置显示屏背景颜色,默认是黑色。要设置数码文字的颜色可以调用DD_SetTextLightColor(COLORREF color)函数,如果要设置数码管熄灭状态的颜色可以调用DD_SetTextDarkColor(COLORREF color)函数。
当仪表被创建时,默认的位置是在窗体的左上角,可以用DD_MoveWindow(int x, int y)函数将它移动到需要的位置。
二、类的应用举例
下面举例说明如何使用该类。
现在我们在基于对话框的程序中使用DigitalDevice类简单制作一个计时器程序,在对话框类的头文件CControlTestDlg.h内加入下面代码:
#include "DigitalDevice.h"
………………
class CTimeWatchDlg : public CDialog
{
// Construction
public:
DigitalDevice *m_dd;
……………
}
然后,在对话框类的cpp文件的OnInitDialog()函数内加入简单的一句代码:
m_dd = new DigitalDevice(this);
这样就成功的创建了一个DigitalDevice类的实例,它具有缺省的参数和缺省的界面(在这里就是一个时钟),会正确的显示在对话框的左上角。之后我们可以通过设置不同的参数来使得它具有不同的属性。
下面的代码创建一个如右图的7位显示屏。
m_dd->DD_SetSize(117, 32); //设置显示屏的尺寸
m_dd->DD_SetTextStyle(12, 25, 2, 2); //设置文字大小、笔划粗细和文字间距
m_dd->DD_SetTextPos(3, 3); //设置文字相对于显示屏左上角的偏移量
m_dd->DD_SetWorkMode(DD_STRING); //设置显示屏的工作方式
m_dd->DD_SetTextLightColor(RGB(0, 255, 0));//设置点亮文字的颜色
m_dd->DD_SetTextDarkColor(RGB(55, 55, 0)); //设置熄灭文字的颜色
m_dd->DD_SetBits(8); //设置显示位数
m_dd->DD_SetBkColor(RGB(0, 0, 0)); //设置显示屏的背景颜色
m_dd->DD_SetBorderWidth(2); //设置显示屏的3D边界宽度
m_dd->DD_MoveWindow(2,0);
注意到m_dd->DD_SetWorkMode(DD_STRING)一句,把显示屏设置成时钟方式,所以它不显示成数值的样式。m_dd->DD_SetBits(8)则设定了位数是8位。
int iInstallResult;
iInstallResult=SetTimer(1,1,NULL);
if(iInstallResult==0)
{
MessageBox("Can not install timer!");
}//设置定时器
接下来就是OnTimer函数了:
void CTimeWatchDlg::OnTimer(UINT nIDEvent)
{
if(m_bstart==true)
{
m_msecond=m_msecond+1;
if(m_msecond>=100)
{
m_msecond=0;
m_second=m_second+1;
}
if(m_second>=60)
{
m_second=0;
m_minute=m_minute+1;
}
if(m_minute>=60)
{
m_minute=0;
m_hour=m_hour+1;
}
if(m_hour>=24)
{
m_second=0;
m_msecond=0;
m_minute=0;
m_hour=0;
}
if(m_hour < 10)
{
if(m_minute < 10 && m_second < 10 )
{
strTime.Format("0%d:0%d:0%d",m_hour,m_minute,m_second);
}
if(m_minute < 10 && m_second > 10 )
{
strTime.Format("0%d:0%d:%d",m_hour,m_minute,m_second);
}
if(m_minute > 10 && m_second > 10 )
{
strTime.Format("0%d:%d:%d",m_hour,m_minute,m_second);
}
}
else
{
if(m_minute < 10 && m_second < 10 )
{
strTime.Format("%d:0%d:0%d",m_hour,m_minute,m_second);
}
if(m_minute > 10 && m_second < 10 )
{
strTime.Format("%d:%d:0%d",m_hour,m_minute,m_second);
}
if(m_minute > 10 && m_second > 10 )
{
strTime.Format("%d:%d:%d",m_hour,m_minute,m_second);
}
}
m_dd->DD_SetCurrentString(strTime);
}
CDialog::OnTimer(nIDEvent);
}
要使用该类,需要在工程中加入DigitalDevice.h和DigitalDevice.cpp两个文件。并在要使用该类的类的头文件上加上#include “DigitalDevice.h”这句话。
一、类的介绍
该类从CStatic类派生,实际上是一个完整的子窗口。它可以仿真任意位数的数码管显示屏,能显示数字0~9,负号,冒号和小数点。它有两种工作方式:DD_STRING(字符串方式)或者是DD_NUMBER(数值方式)。当采用数值方式时,用户能调用DD_SetCurrentNumber(double num)函数来设置数码屏幕要显示的数值,可以显示数字、小数点和负号;当采用字符串模式时,用户能够调用DD_SetCurrentString(CString string)函数来设置要显示的字符串,除了能显示数字、小数点和负号外,还能显示冒号和空格,这很适合用来显示一个时钟,实际上,当将仪表设置成DD_STRING方式并且处于自检状态时,仪表就是一个精确到秒的时钟。要设置仪表的工作方式,应该调用DD_SetWorkMode(UINT mode)函数,mode的取值只能是DD_NUMBER或者DD_STRING。
可以用DD_SetBits(UINT bits)函数动态的设定数码屏幕的显示位数,应该确保数码屏幕的尺寸能够显示这些位,否则过多的位会被裁剪。设置数码屏幕的尺寸可以用DD_SetSize(UINT width, UINT height)函数。每个显示位的样式可以用DD_SetTextStyle(UINT charwidth, UINT charheight, UINT charthick, UINT charspace)函数来设置,其中的charwidth是字符宽度,charheight是字符高度,charthick是字符笔划的宽度,charspace是字符之间的间距。DD_SetTextPos(int x, int y)函数能设置字符相对于显示屏左上角的位置。
仪表具有以下几种状态:
DD_TEST:仪表的自检状态,数字会自动变化,在DD_STRING方式下是一个时钟
DD_WORK:仪表的工作状态,也是创建时的默认状态,等待数值或字符串的变化
DD_SHUTDOWN:仪表的关闭状态,不作任何动作
可以调用DD_SetStatus(UINT status)函数使仪表在上述状态中切换。
DD_SetBdColor(COLORREF lightcolor, COLORREF darkcolor)函数可以设置仪表的3D边框的颜色,参数lightcolor为边框亮部的颜色,darkcolor为边框暗部的颜色。DD_SetBorderWidth(UINT width)函数可以设置边框的线宽。DD_SetBorderStyle(UINT left, UINT top, UINT right, UINT bottom)函数可以设置边框的样式,各参数分别决定左、上、右、下边框是否显示,为1则显示,0则不显示。将部分边框设置成不显示往往是用于显示屏的组合。下图显示了一个显示屏组合的例子,三个显示屏通过调整位置和个别边界的显示与否,在外观上组合起来,就像一个显示屏一样。
DD_SetBkColor(COLORREF color)函数可以设置显示屏背景颜色,默认是黑色。要设置数码文字的颜色可以调用DD_SetTextLightColor(COLORREF color)函数,如果要设置数码管熄灭状态的颜色可以调用DD_SetTextDarkColor(COLORREF color)函数。
当仪表被创建时,默认的位置是在窗体的左上角,可以用DD_MoveWindow(int x, int y)函数将它移动到需要的位置。
二、类的应用举例
下面举例说明如何使用该类。
现在我们在基于对话框的程序中使用DigitalDevice类简单制作一个计时器程序,在对话框类的头文件CControlTestDlg.h内加入下面代码:
#include "DigitalDevice.h"
………………
class CTimeWatchDlg : public CDialog
{
// Construction
public:
DigitalDevice *m_dd;
……………
}
然后,在对话框类的cpp文件的OnInitDialog()函数内加入简单的一句代码:
m_dd = new DigitalDevice(this);
这样就成功的创建了一个DigitalDevice类的实例,它具有缺省的参数和缺省的界面(在这里就是一个时钟),会正确的显示在对话框的左上角。之后我们可以通过设置不同的参数来使得它具有不同的属性。
下面的代码创建一个如右图的7位显示屏。
m_dd->DD_SetSize(117, 32); //设置显示屏的尺寸
m_dd->DD_SetTextStyle(12, 25, 2, 2); //设置文字大小、笔划粗细和文字间距
m_dd->DD_SetTextPos(3, 3); //设置文字相对于显示屏左上角的偏移量
m_dd->DD_SetWorkMode(DD_STRING); //设置显示屏的工作方式
m_dd->DD_SetTextLightColor(RGB(0, 255, 0));//设置点亮文字的颜色
m_dd->DD_SetTextDarkColor(RGB(55, 55, 0)); //设置熄灭文字的颜色
m_dd->DD_SetBits(8); //设置显示位数
m_dd->DD_SetBkColor(RGB(0, 0, 0)); //设置显示屏的背景颜色
m_dd->DD_SetBorderWidth(2); //设置显示屏的3D边界宽度
m_dd->DD_MoveWindow(2,0);
注意到m_dd->DD_SetWorkMode(DD_STRING)一句,把显示屏设置成时钟方式,所以它不显示成数值的样式。m_dd->DD_SetBits(8)则设定了位数是8位。
int iInstallResult;
iInstallResult=SetTimer(1,1,NULL);
if(iInstallResult==0)
{
MessageBox("Can not install timer!");
}//设置定时器
接下来就是OnTimer函数了:
void CTimeWatchDlg::OnTimer(UINT nIDEvent)
{
if(m_bstart==true)
{
m_msecond=m_msecond+1;
if(m_msecond>=100)
{
m_msecond=0;
m_second=m_second+1;
}
if(m_second>=60)
{
m_second=0;
m_minute=m_minute+1;
}
if(m_minute>=60)
{
m_minute=0;
m_hour=m_hour+1;
}
if(m_hour>=24)
{
m_second=0;
m_msecond=0;
m_minute=0;
m_hour=0;
}
if(m_hour < 10)
{
if(m_minute < 10 && m_second < 10 )
{
strTime.Format("0%d:0%d:0%d",m_hour,m_minute,m_second);
}
if(m_minute < 10 && m_second > 10 )
{
strTime.Format("0%d:0%d:%d",m_hour,m_minute,m_second);
}
if(m_minute > 10 && m_second > 10 )
{
strTime.Format("0%d:%d:%d",m_hour,m_minute,m_second);
}
}
else
{
if(m_minute < 10 && m_second < 10 )
{
strTime.Format("%d:0%d:0%d",m_hour,m_minute,m_second);
}
if(m_minute > 10 && m_second < 10 )
{
strTime.Format("%d:%d:0%d",m_hour,m_minute,m_second);
}
if(m_minute > 10 && m_second > 10 )
{
strTime.Format("%d:%d:%d",m_hour,m_minute,m_second);
}
}
m_dd->DD_SetCurrentString(strTime);
}
CDialog::OnTimer(nIDEvent);
}