zoukankan      html  css  js  c++  java
  • 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/

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

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/pinking/p/6739066.html
Copyright © 2011-2022 走看看