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, , TEXT("Texas"));
- PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("Florida"));
- PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("Washington"));
- PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("California"));
- // subset colors
- DWORD dwArray[] = { PERGB(, , , ), PERGB(, , , ), PERGB(, , , ), PERGB(, , , ) };
- PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, , , dwArray, );
- // subset line types
- int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID };
- PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, );
- // subset point types
- int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID };
- PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, );
对于大部分属性,平时可能并不会用到,如果想要仅仅绘制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文件同一路径下。
PreEssentials与MFC集成使用的更多相关文章
- DLL 支持MFC 没有DLLMAIN函数
如果使用VC编写DLL时,需要MFC功能: 一般在源文件里就不能手动写DLLMAIN函数了 它给MFC集成了,\src\mfc\dllmodule.cpp打开它,里面有有一个DLLMAIN函数,根据源 ...
- C++的MFC,与C#的.NET
转载:http://blog.sina.com.cn/s/blog_7f5bde5c0101hk5n.html 以下摘自各问答网站.博客论坛: [1]MFC早已过时,现在C++多数是用来编写底层方法而 ...
- 关于DLL的学习
1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...
- 在MFC对话框中快速集成三维控件
在MFC的对话框中可以方便的集成AnyCAD三维控件(c++版本),遵循一下几步: 1.在对话框资源中增加一个Static控件,ID为IDC_STATIC_3D,并且把它的Notify属性设置为Tru ...
- VC++/MFC(VC6)开发技术精品学习资料下载汇总
工欲善其事,必先利其器,VC开发MFC Windows程序,Visual C++或Visual Studio是必须的,恩,这里都给你总结好了,拿去吧:VC/MFC开发必备Visual C++.Visu ...
- [MFC] VS2013版本MFC工程移植到VC6.0上
:VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本 ...
- MFC学习-第4课 消息机制和MFC作图
转自: 1.http://blog.sina.com.cn/s/blog_6b5180bf01012kbz.html 2.http://blog.csdn.net/happyhhb/article/d ...
- MFC学习-第2,3课 MFC框架的运行机制
转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/ 讲述MFC AppWizard的原理与MFC程序 ...
- MFC中afx_msg是什么,afx_msg void function()是什么意思
应用程序框架产生的消息映射函数例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体:而在map宏定义中,就有 ...
随机推荐
- 2017-2018-2 20179205《网络攻防技术与实践》Windows攻击实验
Windows攻击实验 实验描述: 使用Metaspoit攻击MS08-067,提交正确得到远程shell过程的截图(不少于五张). MS08-067漏洞介绍 MS08-067漏洞的全称为&quo ...
- python 中的__del__
# -*- coding: utf-8 -*- # @Time : 2018/9/19 20:21 # @Author : cxa # @File : delDemo.py # @Software: ...
- [转载]Windows服务编写原理及探讨(4)
(四)一些问题的讨论 前面几章的内容都是服务的一些通用的编写原理,但里面隐含着一些问题,编写简单的服务时看不出来,但遇到复杂的应用就会出现一些问题,所以本章就是用来分析.解决这些问题的,适用于高级应用 ...
- 记录一下mariadb设置主从同步的过程[虚拟机测试]
背景:因为工作的关系,需要找寻实时同步数据到另外系统的服务器的数据库上,查询下来,用mariadb进行跨服务器的同步数据动作,用主从同步比较多,也比较保险 也有使用shell脚本的,定时定候的执行my ...
- Flask:静态文件&模板(0.1)
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 前面看了Flask的Quickstart文档,可是,一直没有练习里面的内容,这不,刚刚练习完毕,来写篇博文记录一下! ...
- 在JAVA中记录日志的十个小建议
JAVA日志管理既是一门科学,又是一门艺术.科学的部分是指了解写日志的工具以及其API,而选择日志的格式,消息的格式,日志记录的内容,哪种消息对应于哪一种日志级别,则完全是基于经验.从过去的实践证明, ...
- SQLAlchemy-介绍安装
一:概述 SQLAlchemy的SQL工具包和对象关系映射是一个全面的工具集,用来处理数据库和Python. 它有几个不同的功能领域,可以单独使用或组合使用. 所示的主要组件,组件依赖关系组织成层: ...
- kafka集群及监控部署
1. kafka的定义 kafka是一个分布式消息系统,由linkedin使用scala编写,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础 ...
- HDU 3068 最长回文(manacher模板题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求字符串s中最长的回文子串 解题思路:manacher模板 代码 #include&l ...
- Unix IPC之Posix信号量实现生产者消费者
采用多生产者,多消费者模型. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** * 生产者 */ P(nempty); P(mutex); // 写入一个 ...