小议VC6中调用ProEssentials v5图表组件实现科学图表绘制-计算_计算机应用论文1 ProEssentials v5简介摘要:ProEssentials v5是应用于windows服务器端和客户端开发的一系列图表组件,它是对绘制图表以及图表分析功能所需要的数据和方法的简单封装。可以提供Winforms、Webforms、ActiveX、VCL和DLL五种界面。它的图表类型很多,包括摘要:一般图表、科学图表、3维图表、极坐标图表、饼状图表,几乎覆盖了所有常见的图表类型。我们可以很方便的调用ProEssentials v5的函数库,添加绘制图表的功能,并可以对图表进行分析,如摘要:回回,求最大值,拟合曲线等。我们还可以很方便的将图表文件的数据文件进行保存,或者导出我们希看格式的图片,如bmp、jpg、png。注摘要:一般图表和科学图表之间的区别在于,一般图表仅提供一维坐标数据绘图,而另一维坐标数据是等间距的。科学图表提供二维坐标数据,绘制任意的散点数据。2具体应用方法摘要:(1)无论开发的是OCX的应用程序、DLL的应用程序还是VCL的应用程序,首先要做的就是根据开发环境的操纵系统类型,拷贝PEGRP32C.DLL到相应的在本地硬盘系统盘中往。假如是win95或者win98操纵系统,拷贝PEGRP32C.DLL到System目录下;假如是win2000操纵系统,拷贝PEGRP32C.DLL到System32目录下。PEGRAPHS.HLP文件是可选的(2)工程里面添加头文件Pegrpapi.h。选择需要调用的函数,完成图表的绘制功能。在此简介,ProEssentials v5函数和变量的命名规则。以PEP_为前缀的变量类型如下摘要:PEP_b Boolean(4 bytes)PEP_n Integer(4 bytes)PEP_dw Double Word(4 bytes)PEP_sz Null Terminated array of characters.PEP_f Single(4 bytes)or Double(8 bytes)floating point.PEP_na Array of Integer(4 bytes)PEP_dwa Array of Double Word(4 bytes)PEP_sza Array of Null Terminated strings.PEP_fa Array of Single(4 bytes)or Double(8 bytes)floating point.PEP_struct Various structures要用DLL调用来设定获取以上变量类型的值,可以根据以上变量类型的前缀来判定应该摘要:PEP_b PEnset/PEngetPEP_n PEnset/PEngetPEP_dw PElset/PElget(16 bit)PEnset/PEnget(32 bit)PEP_sz PEszset/PEszget.PEP_f PEvset/PEvgetPEP_na PEvset,PEvsetcell,PEvsetcellEx/PEvget,PEvgetcell,PEvgetcellExPEP_dwa PEvset,PEvsetcell,PEvsetcellEx/PEvget,PEvgetcell,PEvgetcellExPEP_sza PEvset,PEvsetcell,PEvsetcellEx/PEvget,PEvgetcell,PEvgetcellExPEP_fa PEvset,PEvsetcell,PEvsetcellEx/PEvget,PEvgetcell,PEvgetcellExPEP_struct PEvset,/Pevget(3)选择适当的变量,将数据赋予这些变量。一般图表需要给PEP_faYDATA、PEP_szaPOINTLABELS赋值。科学图表和极坐标图表需要給PEP_faXDATA、PEP_faYDATA和PEP_faZDATA赋值。3D的科学图表需要给PEP_faXDATA,PEP_faYDATA,PEP_faZDATA赋值,但是3D的柱状图仅需要PEP_faYDATA。饼状图用PEP_faXDATA来控制“饼”的厚度,有以下的几个DLL函数可以为图表赋值摘要:PEvset()摘要:一次可以全部的完成所有数据的赋值。PEvsetEx()摘要:一次可以完成部分数据的赋值。.Pevsetcell()摘要:一次仅可以为一维数据赋值。PevsetcellEx()摘要:一次仅可以为一个点赋值。因此Pevset()是最快的赋值方法。(4)选择选择图表中线(点)颜色的方法颜色是由PEP_dwaSUBSETCOLORS控制的,线型是由PEP_naSUBSETLINETYPES控制的,点型是由PEP_naSUBSETPOINTTYPES控制的。以下代码是在C/C++中实现线型设定方法。int nTmpStyles[3;nTmpStyles[0=PELT_THINSOLID;nTmpStyles[1=PELT_DASH;nTmpStyles[2=PELT_DOT;PEvset(hPE,PEP_naSUBSETLINETYPES,nTmpStyles,3);注摘要:以上代码使用的Pevset()函数,也可以使用Pevsetcell()函数来实现线型的设定方法。代码如下摘要:int nTmpStyle;nTmpStyle=PELT_THINSOLID;PEvsetcell(hPE,PEP_naSUBSETLINETYPES,0,%26amp;nTmpStyle);nTmpStyle=PELT_DASH;PEvsetcell(hPE,PEP_naSUBSETLINETYPES,1,%26amp;nTmpStyle);nTmpStyle=PELT_DOT;PEvsetcell(hPE,PEP_naSUBSETLINETYPES,2,%26amp;nTmpStyle);其他设定颜色和点类型的方法和以上方法类似,在此不再赘述。
3实现结果摘要:绘制了一个科学图表,带游标和坐标显示功能,以下函数分别实现基本图表功能和游标显示功能。void CPEView摘要:摘要:CreateSimpleSGraph(){RECT rect;GetClientRect(%26amp;rect)m_hPE=PEcreate(PECONTROL_SGRAPH,WS_VISIBLE,%26amp;rect,m_hWnd,1001);if(m_hPE){float fY;float fX;//设置子集数和每个子集的点数//PEnset(m_hPE,PEP_nSUBSETS,4);PEnset(m_hPE,PEP_nPOINTS,12);for(int s=0;s%26lt;=3;s++){for(int p=0;p%26lt;=11;p++){fX=((float)(p+1))*100.0F;PEvsetcellEx(m_hPE,PEP_faXDATA,s,p,%26amp;fX);fY=((float)(p+1)*1.0F)+GetRandom(1,250);PEvsetcellEx(m_hPE,PEP_faYDATA,s,p,%26amp;fY);}}//设置阴影PEnset(m_hPE,PEP_nDATASHADOWS,PEDS_SHADOWS);PEszset(m_hPE,PEP_szMAINTITLE,“Example Data”);PEszset(m_hPE,PEP_szSUBTITLE,““);//no subtitle PEszset(m_hPE,PEP_szYAXISLABEL,“Units Sold”);PEszset(m_hPE,PEP_szXAXISLABEL,“Month”);PEnset(m_hPE,PEP_bFOCALRECT,FALSE);PEnset(m_hPE,PEP_bPREPAREIMAGES,TRUE);PEnset(m_hPE,PEP_bCACHEBMP,TRUE);PEnset(m_hPE,PEP_nPLOTTINGMETHOD,PEGPM_POINTSPLUSSPLINE);PEnset(m_hPE,PEP_nGRIDLINECONTROL,PEGLC_NONE);PEnset(m_hPE,PEP_nALLOWZOOMING,PEAZ_HORZANDVERT);PEnset(m_hPE,PEP_nZOOMSTYLE,PEZS_RO2_NOT);//子集的标识PEvsetcell(m_hPE,PEP_szaSUBSETLABELS,0,“Texas”);PEvsetcell(m_hPE,PEP_szaSUBSETLABELS,1,“Florida”);PEvsetcell(m_hPE,PEP_szaSUBSETLABELS,2,“Washington”);PEvsetcell(m_hPE,PEP_szaSUBSETLABELS,3,“California”);//子集点的颜色s DWORD dwArray[4={RGB(198,0,0),RGB(0,198,198),RGB(198,198,0),RGB(0,198,0)};PEvsetEx(m_hPE,PEP_dwaSUBSETCOLORS,0,4,dwArray,0);//子集点的线型int nLineTypes[={PELT_MEDIUMSOLID,PELT_MEDIUMSOLID,PELT_MEDIUMSOLID,PELT_MEDIUMSOLID};PEvset(m_hPE,PEP_naSUBSETLINETYPES,nLineTypes,4);//子集点的类型int nPointTypes[={PEPT_DOTSOLID,PEPT_UPTRIANGLESOLID,PEPT_SQUARESOLID,PEPT_DOWNTRIANGLESOLID};PEvset(m_hPE,PEP_naSUBSETPOINTTYPES,nPointTypes,4)//Version 4.0功能//PEnset(m_hPE,PEP_bFIXEDFONTS,TRUE);PEnset(m_hPE,PEP_bSIMPLEPOINTLEGEND,TRUE);PEnset(m_hPE,PEP_bSIMPLELINELEGEND,TRUE);PEnset(m_hPE,PEP_nLEGENDSTYLE,PELS_1_LINE);PEnset(m_hPE,PEP_nMULTIAXISSTYLE,PEMAS_SEPARATE_AXES);//设置其他属性//PEnset(m_hPE,PEP_bBITMAPGRADIENTMODE,TRUE);PEnset(m_hPE,PEP_nQUICKSTYLE,PEQS_MEDIUM_NO_BORDER);PEnset(m_hPE,PEP_nGRADIENTBARS,8);PEnset(m_hPE,PEP_nTEXTSHADOWS,PETS_BOLD_TEXT);PEnset(m_hPE,PEP_bMAINTITLEBOLD,TRUE);PEnset(m_hPE,PEP_bSUBTITLEBOLD,TRUE);PEnset(m_hPE,PEP_bLABELBOLD,TRUE);PEnset(m_hPE,PEP_bLINESHADOWS,TRUE);PEnset(m_hPE,PEP_nFONTSIZE,PEFS_LARGE);PEnset(m_hPE,PEP_bSCROLLINGHORZZOOM,TRUE);}}void CPEView摘要:摘要:CreateDataCursor(){CreateSimpleSGraph();//创建游标//PEnset(m_hPE,PEP_nCURSORMODE,PECM_DATACROSS);//可以方便的查看数据点//PEnset(m_hPE,PEP_bMARKDATAPOINTS,TRUE);//可以点击数据点来移动游标//PEnset(m_hPE,PEP_bMOUSECURSORCONTROL,TRUE);PEnset(m_hPE,PEP_bALLOWDATAHOTSPOTS,TRUE);//Cursor prompting in top left corner//PEnset(m_hPE,PEP_bCURSORPROMPTTRACKING,TRUE);PEnset(m_hPE,PEP_nCURSORPROMPTSTYLE,PECPS_XYVALUES);PEnset(m_hPE,PEP_nCURSORPROMPTLOCATION,PECPL_TOP_RIGHT);//取消放大功能PEnset(m_hPE,PEP_nALLOWZOOMING,PEAZ_NONE);//其他可能的游标模式如下摘要://PECM_NOCURSOR=0//PECM_POINT=1//PECM_DATACROSS=2//PECM_DATASQUARE=3//PECM_FLOATINGY=4//PECM_FLOATINGXY=5//注重摘要:必须重新初始化else if((m_nLastSelection==105)%26amp;%26amp;(HIWORD(wp)==PEWN_CURSORMOVE)){int nSubset,nPoint;float xvalue,yvalue;char buffer[64;nSubset=PEnget(m_hPE,PEP_nCURSORSUBSET);nPoint=PEnget(m_hPE,PEP_nCURSORPOINT);PEvgetcellEx(m_hPE,PEP_faXDATA,nSubset,nPoint,%26amp;xvalue);PEvgetcellEx(m_hPE,PEP_faYDATA,nSubset,nPoint,%26amp;yvalue);sprintf(buffer,“Cursor at%d,%d=(%.2f,%.2f)”,nSubset,nPoint,xvalue,yvalue);CWnd*pParent=GetParent()-%26gt;GetParent();if(pParent){pParent-%26gt;SetWindowText(buffer);}pParent=AfxGetMainWnd();if(pParent){pParent-%26gt;SetWindowText(“PEWN_CURSORMOVE”);return TRUE;}}以上代码在Win2000,VC6环境下调试通过。