MFC制作漂亮的数码管(动态库)
1、新建一个DLL工程
打开VS2012,点击新建项目出现新建项目对话框,如下图所示;

2、创建MFC工程
选择MFC —> MFCDLL;键入项目名称以及解决方案名称,可以不一样,选择存放位置,点击确定;进入MFC DLL向导,点击下一步;
选择使用共享MFC DLL的规则DLL点击完成;
这时候就生成了一个空的MFC DLL工程;


3、添加用户程序
点击解决方案资源管理器;
进入添加新项界面,选择头文件,输入头文件名,点击添加
#define MyDigitalAPI __declspec(dllexport)
#define MyDigitalAPI1 __declspec(dllimport)
extern "C" {
// We delete the function DLLfun1 (as defined
// in the W32DLL DLL) it writes to
// a console, not a window, it isn't appropriate to
// call it from a MFC Client.
MyDigitalAPI void Diplay(CDC *pDC,int x1,int y1,float size,short axis);
MyDigitalAPI void Ellipse1(CDC *pDC,int x,int y,int rec,COLORREF color);
MyDigitalAPI void OnDraw(CDC *pDC,COLORREF color,int x,int y,float ch,int indx);
MyDigitalAPI void Rectangle1(CDC *pDC,int x,int y,int x1,int y1,COLORREF color,int size);
MyDigitalAPI1 float XXS;
MyDigitalAPI1 float YYS;
MyDigitalAPI1 float ZZS;
MyDigitalAPI1 float CCS;
};


4、同样的方法在添加一个源文件;
#include "StdAfx.h"
#include "MyDigital.h"
#include <math.h>
#include "CDefine.h"
//头文件包含情况,CDfine.h主要是定义RGB颜色.
void OnDraw(CDC *pDC,COLORREF color,int x,int y,float ch,int indx)
{
CPen Pen(PS_SOLID, 1, color);//数码管外框画笔
CPen *OldPen=pDC->SelectObject(&Pen);
CRgn Rgn;
CPoint Point[7],Point1[7],Point2[7],Point3[7],Point4[7],Point5[7],Point6[7];//定义数码管的7段,每段由7个点组成
Point[0]=CPoint(x,y);
Point[1]=CPoint(x+(ch*16),y);
Point[2]=CPoint(x+(ch*17),y+ch);
Point[3]=CPoint(x+(ch*14),y+(ch*4));
Point[4]=CPoint(x+(2*ch),y+(ch*4));
Point[5]=CPoint(x-ch,y+ch);
Point[6]=CPoint(x,y);
...这里是剩下的六段,就不一一贴上了,需要的留邮箱
CBrush BkBrsh(color);
CBrush *OldBrush=pDC->SelectObject(&BkBrsh);//数码管数字显示颜色
switch(indx)//和真正的数码管使用一样,这个switch判断的作用也是段选
{
case 0://当要显示0的时候需要用到下面这些端,那么这些段显示,其他不显示
pDC->Polygon(Point,7);//将point数组中的7个点连接围城一个不规则区域
pDC->Polygon(Point1,7);
pDC->Polygon(Point2,7);
pDC->Polygon(Point3,7);
pDC->Polygon(Point4,7);
pDC->Polygon(Point5,7);
break;
case 1:
pDC->Polygon(Point2,7);
pDC->Polygon(Point4,7);
break;
case 2:
pDC->Polygon(Point,7);
pDC->Polygon(Point2,7);
pDC->Polygon(Point3,7);
pDC->Polygon(Point5,7);
pDC->Polygon(Point6,7);
break;
...剩下是数字定义未列出,留邮箱获取
default:
break;
}
Pen.DeleteObject();//释放资源
BkBrsh.DeleteObject();//释放资源
}
void Diplay(CDC *pDC,int x1,int y1,float size,short axis)//界面显示用
{
switch(axis)//模拟机器四个轴(当初做数码管视为了显示四轴机器人运动位置)
{
case AXIS_X:
dco=XXS;
break;
case AXIS_Y:
dco=YYS;
break;
case AXIS_Z:
dco=ZZS;
break;
case AXIS_C:
dco=CCS;
break;
default:
break;
}
//个位到百位
int bai=int(fabs(dco))/100;
int shi=int(fabs(dco))%100/10;
int ge=int(fabs(dco))%100%10;
//小数点后三位
float fg=fabs(dco)-(int)fabs(dco);
int yi=int(fg*10);
int er=int(fg*100)%10;
int san=int(fg*1000)%100%10;
int ch1=30*size;
int ch2=5*size;
Rectangle1(pDC,x1-ch2-(ch1/5),y1-(ch2/2)-(ch1/6),x1+7*ch1+ch2,y1+1.6*ch1,CLR_SEGBK,int(size));
//数码管阴影
/***************************************************************************/
OnDraw(pDC,CLR_YYRED,x1,y1,size,8);
OnDraw(pDC,CLR_YYRED,x1+1*ch1,y1,size,8);
OnDraw(pDC,CLR_YYRED,x1+2*ch1,y1,size,8);
OnDraw(pDC,CLR_YYRED,x1+3*ch1,y1,size,8);
OnDraw(pDC,CLR_YYRED,x1+4*ch1+ch2,y1,size,8);
OnDraw(pDC,CLR_YYRED,x1+5*ch1+ch2,y1,size,8);
OnDraw(pDC,CLR_YYRED,x1+6*ch1+ch2,y1,size,8);
//整数部分
/***************************************************************************/
if (bai==0)
{
OnDraw(pDC,CLR_LIGHTRED,x1,y1,size,11);//百位为零时,第一位不显示
if (shi==0)
{
OnDraw(pDC,CLR_LIGHTRED,x1+1*ch1,y1,size,11);//十位为零百位不显示
if (dco>0)
{
OnDraw(pDC,CLR_LIGHTRED,x1+2*ch1,y1,size,11);//数值大于零十位不显示
OnDraw(pDC,CLR_LIGHTRED,x1+3*ch1,y1,size,ge);//显示个位
}
else if (dco<0)
{
OnDraw(pDC,CLR_LIGHTRED,x1+2*ch1,y1,size,10);//数值小于零十位显示负号OnDraw(pDC,CLR_LIGHTRED,x1+3*ch1,y1,size,ge);//显示个位
}
else
{
OnDraw(pDC,CLR_LIGHTRED,x1+2*ch1,y1,size,11);//数值小于零十位不显示
OnDraw(pDC,CLR_LIGHTRED,x1+3*ch1,y1,size,ge);//显示个位
}
}
else
{
if (dco>0)
{
OnDraw(pDC,CLR_LIGHTRED,x1+1*ch1,y1,size,11);//十位不为零且数值大于零百位不显示
}
else
{
OnDraw(pDC,CLR_LIGHTRED,x1+1*ch1,y1,size,10);//十位不为零且数值小于零百位显示负号
}
OnDraw(pDC,CLR_LIGHTRED,x1+2*ch1,y1,size,shi);
OnDraw(pDC,CLR_LIGHTRED,x1+3*ch1,y1,size,ge);
}
}
else//百位不为零正常显示
{
if (dco>0)
{
OnDraw(pDC,CLR_LIGHTRED,x1,y1,size,11);
}
else
{
OnDraw(pDC,CLR_LIGHTRED,x1,y1,size,10);
}
OnDraw(pDC,CLR_LIGHTRED,x1+1*ch1,y1,size,bai);
OnDraw(pDC,CLR_LIGHTRED,x1+2*ch1,y1,size,shi);
OnDraw(pDC,CLR_LIGHTRED,x1+3*ch1,y1,size,ge);
}
OnDraw(pDC,CLR_LIGHTRED,x1+4*ch1+ch2,y1,size,yi);
OnDraw(pDC,CLR_LIGHTRED,x1+5*ch1+ch2,y1,size,er);
OnDraw(pDC,CLR_LIGHTRED,x1+6*ch1+ch2,y1,size,san);
Ellipse1(pDC,x1+3.8*ch1,y1+1.2*ch1,size*4,CLR_LIGHTRED);//小数点
}
//小数点以及外框实现较为简单,这里就不贴代码了,需要留邮箱

5、效果图
