• PreEssentials与MFC集成使用


    ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表。它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm)、ASP.NET(WebForm)、ActiveX、DLL和VCL。ProEssentials有三种版本,Pro、Standard和Lite。其中Pro是最完整的,开发无任何限制。

    在MFC中开发过程如下:

    1、创建MFC工程(静态编译)

    2、添加头文件“Pegrpapi.h”、附加链接库“PEGRP32E.lib

    3、打开PEDemo,寻找例子

    copy该例子,添加到工程中,例子中需要调整某些错误,譬如:

    GetRandom函数不存在,可以宏定义生成:

    #define getrandom( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min))

    注释掉其中的使用GDI+的调用函数

    // Set Demo's RenderEngine to Gdi Plus // 
    CMDIFrameWnd* pWnd = (CMDIFrameWnd*)AfxGetApp()->GetMainWnd();
    pWnd->SendMessage(WM_CHANGE_METAFILE, PEPLAYMETAFILEGDIPLUS);
    

    有效的代码如下:

    void CProMfcDlg::CreateSimpleSGraph()
    {
    	//! Right button click to show popup menu. //
    	//! Double Click to show customization dialog. //
    	//! Left-Click and drag to draw zoom box. Use popup memu or 'z' to undo zoom. // 
    
    	// Simple example show the basics of a scientific graph object. //
    	// Scientific Graph's contain both YData and XData and thus data
    	// is not plotted equally spaced as the graph object does.
    
    	RECT rect;
    	GetClientRect(&rect);
    	HWND m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001);
    	if (m_hPE)
    	{
    		float fY;
    		float fX;
    
    		// Enable middle mouse dragging //
    		PEnset(m_hPE, PEP_bMOUSEDRAGGINGX, TRUE);
    		PEnset(m_hPE, PEP_bMOUSEDRAGGINGY, TRUE);
    
    		// Enable Bar Glass Effect //
    		PEnset(m_hPE, PEP_bBARGLASSEFFECT, TRUE);
    
    		// Enable Plotting style gradient and bevel features //
    		PEnset(m_hPE, PEP_nAREAGRADIENTSTYLE, PEPGS_RADIAL_BOTTOM_RIGHT);
    		PEnset(m_hPE, PEP_nAREABEVELSTYLE, PEBS_MEDIUM_SMOOTH);
    		PEnset(m_hPE, PEP_nSPLINEGRADIENTSTYLE, PEPGS_RADIAL_BOTTOM_RIGHT);
    		PEnset(m_hPE, PEP_nSPLINEBEVELSTYLE, PESBS_MEDIUM_SMOOTH);
    
    		// Set number of Subsets and Points //
    		PEnset(m_hPE, PEP_nSUBSETS, 4);
    		PEnset(m_hPE, PEP_nPOINTS, 12);
    
    		for (int s = 0; s <= 3; s++)
    		{
    			for (int p = 0; p <= 11; p++)
    			{
    				fX = ((float)(p + 1)) * 100.0F + ((float)getrandom(2, 250)) / 50.0F;
    				PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &fX);
    				fY = ((float)(p + 1) * 1.0F) + getrandom(1, 250) + 700.0F - ((float)(s * 140.0F)) + ((float)getrandom(2, 250)) / 250.0F;
    				PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &fY);
    			}
    		}
    
    		// Set DataShadows to show shadows
    		PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS);
    
    		PEszset(m_hPE, PEP_szMAINTITLE, TEXT("Example Data"));
    		PEszset(m_hPE, PEP_szSUBTITLE, TEXT("")); // no subtitle
    		PEszset(m_hPE, PEP_szYAXISLABEL, TEXT("Units Sold"));
    		PEszset(m_hPE, PEP_szXAXISLABEL, TEXT("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_SPLINE);
    		PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_BOTH);
    		PEnset(m_hPE, PEP_nGRIDSTYLE, PEGS_DOT);
    		PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_HORZANDVERT);
    		PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT);
    
    		// subset labels
    		PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 0, TEXT("Texas"));
    		PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 1, TEXT("Florida"));
    		PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 2, TEXT("Washington"));
    		PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 3, TEXT("California"));
    
    		// subset colors
    		DWORD dwArray[4] = { PERGB(128, 198, 0, 0), PERGB(128, 0, 198, 198), PERGB(128, 198, 198, 0), PERGB(128, 0, 198, 0) };
    		PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, 0, 4, dwArray, 0);
    
    		// subset line types
    		int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID };
    		PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, 4);
    
    		// subset point types
    		int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID };
    		PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, 4);
    
    		// Version 4.0 Features //
    		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);
    
    		// Set Various Other Properties //
    		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);
    		PEnset(m_hPE, PEP_nDATAPRECISION, 1);
    
    		// Improves metafile export //
    		PEnset(m_hPE, PEP_nDPIX, 600);
    		PEnset(m_hPE, PEP_nDPIY, 600);
    
    		//// Set Demo's RenderEngine to Gdi Plus // 
    		//CMDIFrameWnd* pWnd = (CMDIFrameWnd*)AfxGetApp()->GetMainWnd();
    		//pWnd->SendMessage(WM_CHANGE_METAFILE, PEPLAYMETAFILEGDIPLUS);
    	}
    }
    

    效果图:

    对上述代码的探究:

    (1)PEcreate(nObjectType ,  dwStyle,  lpRect,  hParent,  nID)

    返回一个窗口的句柄,这个函数会调用CreateWindow方法,新建的这个窗口会完成PreEssentials的功能。参数有5个,分别为:

    nObjectType代表了5种图表的类型,

    ,需要创建哪种类型的图标,在Demo中寻找相关例子即可。

    dwStyle,指窗体类型,通常可以设为0。

    lpRect,窗体的大小区域。

    hParent,父窗体,用来放置创建的新的窗体。

    nID,子窗口的ID,可以随便设置,一般没啥用。

    (2)PEnset( hObject,nProperty,nData)

    hObject为PEcreate的返回值。

    这个函数就是设置这个图表对象的一些属性。

    (3)PEvsetcellEx(hObject, nProperty, nSubset, nPoint, lpvData)

    hObject同上

    nProperty,指的是设置的属性,譬如PEP_faXDATA、PEP_faYDATA分别是x轴和y轴的数据。

    nSubset,索引从0开始的,指的是第几条线(子集)

    nPoint,索引从0开始,指的是第几个点

    lpvData,具体的值了,是一个指针类型

    (4)PEszset(hObject, nProperty, lpszData)

    设置对象的文字属性,代码中:PEP_szMAINTITLE、PEP_szSUBTITLE、PEP_szYAXISLABEL、PEP_szXAXISLABEL等主标题、子标题、x、y轴的标题都可以通过它设置。

    (5)PEvsetcell (hObject, nProperty, nCell, lpvData)

    设置子集的标签的名字

    (6)PEvsetEx (hObject, nProperty, nStartingCell, nCellCount, lpvData, lpvMemSet)

    为子集的某些属性传递矩阵参数

    例子中设置的是子集的颜色。

    其中代码部分,如下,类似于matlab中plot设置多个子集的线条颜色、形状,以及legend设置子集的名字。

    // subset labels
            PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 0, TEXT("Texas"));
            PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 1, TEXT("Florida"));
            PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 2, TEXT("Washington"));
            PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 3, TEXT("California"));
    
            // subset colors
            DWORD dwArray[4] = { PERGB(128, 198, 0, 0), PERGB(128, 0, 198, 198), PERGB(128, 198, 198, 0), PERGB(128, 0, 198, 0) };
            PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, 0, 4, dwArray, 0);
    
            // subset line types
            int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID };
            PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, 4);
    
            // subset point types
            int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID };
            PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, 4);

    对于大部分属性,平时可能并不会用到,如果想要仅仅绘制4个线,对上述化简,最基础的属性为:

    void CProMfcDlg::CreateSimpleSGraph()
    {
    	RECT rect;
    	GetClientRect(&rect);
    	HWND m_hPE = PEcreate(PECONTROL_SGRAPH, 0, &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 <= 3; s++)
    		{
    			for (int p = 0; p <= 11; p++)
    			{
    				fX = ((float)(p + 1)) * 100.0F + ((float)getrandom(2, 250)) / 50.0F;
    				PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &fX);
    				fY = ((float)(p + 1) * 1.0F) + getrandom(1, 250) + 700.0F - ((float)(s * 140.0F)) + ((float)getrandom(2, 250)) / 250.0F;
    				PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &fY);
    			}
    		}	
    		
    	}
    }
    

     

    上面对其中常见的函数做了总结,其中的各种属性比较复杂,需要后续不断积累学习.

    在使用过程中,对窗体右键会弹出一些高级的操作项,但是这些都是英文的,可以将汉化包放到SysWOW64文件夹中,同PEGRP32E.DLL在一个路径中。即可完成汉化,方便了我们的学习使用。

    未汉化时:

    最后,如果想要在其他电脑上使用程序,需要注意的是,要把PEGRP32E.DLL和汉化的包放到exe文件同一路径下。

    作者:禅在心中

    出处:http://www.cnblogs.com/pinking/

    本文版权归作者和博客园共有,欢迎批评指正及转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增
    xmlInitParser 和 xmlCleanupParser 使用详解
    修改虚拟机硬盘的大小
    linux 查看系统进程命令
    linux查看系统信息的命令
    Eclipse快捷键大全(转载)
    获取可执行文件的全路径和所属目录
    dlopen加载c++ 函数及类
    使用LVM在vmware中增大linux的根分区
    查看linux的文件系统是什么格式的(如ext2,ext3,xfs等)?
  • 原文地址:https://www.cnblogs.com/pinking/p/6739066.html
Copyright © 2020-2023  润新知