PreEssentials与MFC集成使用

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,寻找例子

<span>PreEssentials与MFC集成使用</span>

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);
	}
}

 

效果图:

<span>PreEssentials与MFC集成使用</span>

 

对上述代码的探究:

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

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

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

<span>PreEssentials与MFC集成使用</span>,需要创建哪种类型的图标,在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);
			}
		}	
		
	}
}

 <span>PreEssentials与MFC集成使用</span>

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

 

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

<span>PreEssentials与MFC集成使用</span>

未汉化时:

<span>PreEssentials与MFC集成使用</span>

 

 

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119497.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PTA-集合相似度[通俗易懂]

    PTA-集合相似度[通俗易懂]原题链接输入样例:33 99 87 1014 87 101 5 877 99 101 18 5 135 18 9921 21 3输出样例:50.00%33.33%#include<bits/stdc++.h>#define x first#define y second#define send string::nopsusing namespace std;typedef long long ll;const int N = 1e4 + 10;cons

    2022年8月9日
  • 在Anaconda中安装OpenCV

    anaconda中安装OpenCV在anaconda中安装opencv查询Python与anaconda版本安装方法开始安装验证是否成功在anaconda中安装opencv本人使用的是win10系统,anaconda版本为4.7.12,python版本为3.7.4查询Python与anaconda版本按win+r键后输入cmd,弹出命令提示符窗口。然后输入:conda-V查询anaconda版本。输入:python查询python版本。后续安装opencv需要安装对应pyth

    2022年4月5日
  • 关于allow_url_fopen的设置与服务器的安全

    关于allow_url_fopen的设置与服务器的安全allow_url_fopen与安全以及PHPlibcurl  allow_url_fopen=ON常常会给服务器和管理员带来麻烦,但是经常性(至少我这样认为)的我们需要远程读取某个东西,如果设置allow_url_fopen=OFF将其关闭,我们就没有办法远程读取。  幸好我们有一个很好的PHP模块–curl。下面我就以一个例子说说我用curl远程读取的方法:  第一,allow_url_fopen=ON的情况下:<?php$str=file_get_contents(“http:

    2022年7月16日
  • mm理论怎么通俗理解_通俗易懂的理解三观

    mm理论怎么通俗理解_通俗易懂的理解三观讲这个之前,先讲一下什么叫对称加密,什么叫非对称加密:通俗理解:对称加密,一个盒子,两把钥匙,两把钥匙都可以锁和开锁。非对称加密,一个盒子,一个私人钥匙,很多公共的钥匙。两种情况:1,私人的钥匙能锁能开锁,公共的钥匙,只能开锁,不能上锁2,私人的钥匙能锁能开锁,公共的钥匙,只能上锁,不能开锁改革春风吹进家,江南贸易遍开花。随着改革开放的推进,小K家里的生意也越做越好,正洽迎上互联网的…

    2022年10月2日
  • 如何用qq裁剪图片并使用_ps裁剪比例怎么自定义

    如何用qq裁剪图片并使用_ps裁剪比例怎么自定义QQ图像自定义剪裁功能:一:主布局界面二:点击控件触发事件后效果图三:拍照完之后效果图四:裁剪界面效果图五:点击相册后返回的图片效果图六:裁剪完从相册PICK的保存后的效果图

    2022年8月10日
  • 人工神经网络多层感知器_基于BP网络的多层感知器用来干嘛

    人工神经网络多层感知器_基于BP网络的多层感知器用来干嘛虽然异或问题成为感知器和早期神经网络的阿喀琉斯之踵,但它并非无解的问题。恰恰相反,解决它的思路相当简单,就是将单层感知器变成多层感知器。1,多层感知器(multilayerperceptron)包含一个或多个在输入节点和输出节点之间的隐藏层(hiddenlayer),除了输入节点外,每个节点都是使用非线性激活函数的神经元;2,多层感知器是一类前馈人工神经网络;3,多层感知器的训练包括以下步骤:首先确定给定输入和当前权重下的输出,再将输出和真实值相减得到误差函数,最后根据误差函数更新权重。在训练过程中

    2022年10月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号