文件名: LedDisp.h
版本号: v1.0.5 (v20091122.00001)
功能: 显示七段数码管风格的数字、小数点、冒号及部分字母。
(此版本理论上可用于MFC,Win32 SDK或其它环境,在Windows XP sp2下用vc6.0及vs2008编译、运行通过.)
第一作者: Jef
日期: 20091122
电子邮件: dungeonsnd@126.com
地址: 中国/江苏
版权: 1.您可以修改及免费使用本程序,但把本程序或修改后程序用于商业用途前请先通知第一作者并得到作者的许可。
2.修改之后保留此文件开头处的文件说明信息并更改副版本号(如 v20090825.00001 改成 v20091002.00001 ),
并拷贝一份附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。
3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。
4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用!
其它:
v1.0.1 (v20090825.00001)
v1.0.2 (v20091026.00001) 1.增加Hide()方法 2.增加IsHide()方法
3.增加Disp(CDC* pdc,CRect DispRect,int iDigitsAmount,CString cs);方法 4.等
v1.0.3 (v20091031.00001) 1.增加多个小数点和冒号显示支持 2.增加GetLedFont()方法
3.修改了显示熄灭数码管的内部实现 4.等
v1.0.4 (v20091105.00001) 1.修改了SetSegmentPosition(int index)函数,增加内部属性 修正因子m_bMakeAmend,
设置修改因子为真时,在特殊情况下(如用户设置段宽度为2个像素或者1个像素),
程序将保证所有段的宽度相等,并且保证段与段不会相连.
2.修改了保存显示区域背景机制! 前一版本在调用数码管显示函数(Disp()等函数)时会自动
保存一幅对应于显示区域RECT的位图,此种机制当用户在OnPaint()函数里调用显示
函数而不调用Hide()时,并且此时的RECT在每次调用显示函数时都改变,则会导致保存
背景位图的向量m_vecBkSave不断扩大,而实际上保存的位图将没有作用且浪费大量内存!
如:
void CLEDView::OnPaint()
{
CPaintDC dc(this);
OnShow(); //不断的以不同的RECT区域调用Disp()将导致保存的
//位图(对应于每个区域)数量剧增!
}
void CLEDView::OnShow()
{
CClientDC dc(this);
CRect rtClient;
GetClientRect(&rtClient);
double m_x =rtClient.Width()/800.0;
double m_y =rtClient.Height()/600.0;
CRect rt0;
rt0.SetRect(20*m_x,10*m_y,220*m_x,410*m_y);
led.Disp((CDC*)&dc,rt0,1,_T("1:"));
}
解决方案: 保存位图将不再以RECT来标识,而是以一个用户输入的字符串来标识.
3. 添加MFC之外框架的支持.(未完成,未测试,希望测试的用户给作者联系测试结果.如WIN32 SDK,WTL等环境下.)
v1.0.5 (v20091122.00001) 1. 增加UNICODE支持 2.完成MFC外的某些框架的支持 3.修改了和完善了某些代码段。如 删除保存背景的
向量某一元素之前先把其中的位图删除; 内存dc用完之后添加删除操作 DeleteDC ; 构析函数中增加了删除
全部位图资源操作 4. 修改了数个变量名使其更统一,如 SHOWPOS改成了iShowPos; 删除了某些接口,如 DispInt();
2.说明及注意 (Attention!)
a.支持 改变数码管亮时的颜色 灭时颜色 区域背景色,支持居左居中居右显示,支持细调显示的位置(SetFont();)及数码管粗细等细节.
支持距离左或右一定距离显示字符串(m_iDistaceToRight).
支持创建不定数量的自定义字体(LedFontID来表示已创建的不同字体,已经创建过的字体被再次创建时则改写这个字体).
支持默认参数(调用时可以依次不传递有默认值参数).
b.显示的字符的宽度与高度不随窗口的大小变化而自动变化,故调用者应自行处理.
c.内部不含自动重画功能,故调用者应自己处理窗口重绘时字符的重新显示.
d.字符串内可同时含 ":"与"." ,但字符串左起第一个字符不能为":"或"." ,且不能连续两个不点位符号,如小数点或冒号!!
e.能显示的字符包括 0-9,a-f,A-F,".",":","-"
f.如
bool Disp(HDC hDc,RECT rtDispRect,TCHAR* cs,int iFontWidth,int iFontHeight,TCHAR* strIdentifier=_T("LedValue1"));
用户应自己设置好 rtDispRect与iFontWidth iFontHeight 的大小关系. 如果iFontHeight大于rtDispRect.Height(),则超出DispRect区域显示字符.
但左右可能不会超出显示(用户可设置m_bShowWhenOverstepRect来控制是否显示).
调用者应自己保证使字符串能全部显示在DispRect中,否则超出部分可能不会显示!!!
g.当字符的宽度与数码管的每一段的宽度比例严重失调时,显示的字符会严重失真(如数码管每一段宽度为5个像素,
而长度却也为5像素则显示效果将失真)!
一般情况下,iFontHeight=2*m_iFontWidth,m_dSegmentWidth远小于m_iFontWidth
h. led.SetColor(RGB(0,200,0)) 等方法会改变类的字体属性,故之后调用显示时字体属性都会发生改变. 但创建新的字体时不会改变类的字体属性.
i.调用 Disp(...,strIdentifier)等此类数码管显示函数显示数码管后, 显示区域的背景及区域会自动保存.
1.再次调用Disp(...,strIdentifier)时会用新的显示区域的背景替换原背景及区域;
2.调用Hide(...,strIdentifier)方法时程序会自动删除strIdentifier对应原位图及区域,然后隐藏该区域的数码管(用原背景位图贴在此区域);
3.对象析构时会自动删除已经保存的所有的背景位图及区域.
3.使用方法(仅举一种使用方法) (Using e.g.)
i.
void CLEDView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
OnShow();
// Do not call CView::OnPaint() for painting messages
}
void CLEDView::OnShow()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CRect rtClient;
GetClientRect(&rtClient);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&bmp);
dc.StretchBlt(0,0,rtClient.Width(),rtClient.Height(),&memdc,0,0,
800,600,SRCCOPY);
double m_x =rtClient.Width()/800.0;
double m_y =rtClient.Height()/600.0;
CRect rt0;
rt0.SetRect(int(20*m_x),int(10*m_y),int(420*m_x),int(80*m_y));
CString s;
s ="123-:1:.";
TCHAR str[256];
sprintf(str,"%s",s);
led.DispDigits((HDC)dc,rt0,str,7,_T("Led1"));
}
void CLEDView::OnHide()
{
// TODO: Add your command handler code here
CClientDC dc(this);
led.Hide((HDC)dc,"Led1");
}
ii.
CClientDC dc(this);
......
CRect rt0;
rt0.SetRect(int(20*m_x),int(10*m_y),int(420*m_x),int(80*m_y));
CString s;
s ="123-:1:.";
led.Disp_mfc((CDC*)&dc,rt0,s,27,45,_T("Led1"));
*/
1