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+的调用函数

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

有效的代码如下:

  1. void CProMfcDlg::CreateSimpleSGraph()
  2. {
  3. //! Right button click to show popup menu. //
  4. //! Double Click to show customization dialog. //
  5. //! Left-Click and drag to draw zoom box. Use popup memu or 'z' to undo zoom. //
  6.  
  7. // Simple example show the basics of a scientific graph object. //
  8. // Scientific Graph's contain both YData and XData and thus data
  9. // is not plotted equally spaced as the graph object does.
  10.  
  11. RECT rect;
  12. GetClientRect(&rect);
  13. HWND m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001);
  14. if (m_hPE)
  15. {
  16. float fY;
  17. float fX;
  18.  
  19. // Enable middle mouse dragging //
  20. PEnset(m_hPE, PEP_bMOUSEDRAGGINGX, TRUE);
  21. PEnset(m_hPE, PEP_bMOUSEDRAGGINGY, TRUE);
  22.  
  23. // Enable Bar Glass Effect //
  24. PEnset(m_hPE, PEP_bBARGLASSEFFECT, TRUE);
  25.  
  26. // Enable Plotting style gradient and bevel features //
  27. PEnset(m_hPE, PEP_nAREAGRADIENTSTYLE, PEPGS_RADIAL_BOTTOM_RIGHT);
  28. PEnset(m_hPE, PEP_nAREABEVELSTYLE, PEBS_MEDIUM_SMOOTH);
  29. PEnset(m_hPE, PEP_nSPLINEGRADIENTSTYLE, PEPGS_RADIAL_BOTTOM_RIGHT);
  30. PEnset(m_hPE, PEP_nSPLINEBEVELSTYLE, PESBS_MEDIUM_SMOOTH);
  31.  
  32. // Set number of Subsets and Points //
  33. PEnset(m_hPE, PEP_nSUBSETS, 4);
  34. PEnset(m_hPE, PEP_nPOINTS, 12);
  35.  
  36. for (int s = 0; s <= 3; s++)
  37. {
  38. for (int p = 0; p <= 11; p++)
  39. {
  40. fX = ((float)(p + 1)) * 100.0F + ((float)getrandom(2, 250)) / 50.0F;
  41. PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &fX);
  42. fY = ((float)(p + 1) * 1.0F) + getrandom(1, 250) + 700.0F - ((float)(s * 140.0F)) + ((float)getrandom(2, 250)) / 250.0F;
  43. PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &fY);
  44. }
  45. }
  46.  
  47. // Set DataShadows to show shadows
  48. PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS);
  49.  
  50. PEszset(m_hPE, PEP_szMAINTITLE, TEXT("Example Data"));
  51. PEszset(m_hPE, PEP_szSUBTITLE, TEXT("")); // no subtitle
  52. PEszset(m_hPE, PEP_szYAXISLABEL, TEXT("Units Sold"));
  53. PEszset(m_hPE, PEP_szXAXISLABEL, TEXT("Month"));
  54. PEnset(m_hPE, PEP_bFOCALRECT, FALSE);
  55. PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE);
  56. PEnset(m_hPE, PEP_bCACHEBMP, TRUE);
  57. PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_SPLINE);
  58. PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_BOTH);
  59. PEnset(m_hPE, PEP_nGRIDSTYLE, PEGS_DOT);
  60. PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_HORZANDVERT);
  61. PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT);
  62.  
  63. // subset labels
  64. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 0, TEXT("Texas"));
  65. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 1, TEXT("Florida"));
  66. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 2, TEXT("Washington"));
  67. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 3, TEXT("California"));
  68.  
  69. // subset colors
  70. DWORD dwArray[4] = { PERGB(128, 198, 0, 0), PERGB(128, 0, 198, 198), PERGB(128, 198, 198, 0), PERGB(128, 0, 198, 0) };
  71. PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, 0, 4, dwArray, 0);
  72.  
  73. // subset line types
  74. int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID };
  75. PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, 4);
  76.  
  77. // subset point types
  78. int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID };
  79. PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, 4);
  80.  
  81. // Version 4.0 Features //
  82. PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE);
  83. PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE);
  84. PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE);
  85. PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE);
  86. PEnset(m_hPE, PEP_nMULTIAXISSTYLE, PEMAS_SEPARATE_AXES);
  87.  
  88. // Set Various Other Properties //
  89. PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
  90. PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER);
  91.  
  92. PEnset(m_hPE, PEP_nGRADIENTBARS, 8);
  93. PEnset(m_hPE, PEP_nTEXTSHADOWS, PETS_BOLD_TEXT);
  94. PEnset(m_hPE, PEP_bMAINTITLEBOLD, TRUE);
  95. PEnset(m_hPE, PEP_bSUBTITLEBOLD, TRUE);
  96. PEnset(m_hPE, PEP_bLABELBOLD, TRUE);
  97. PEnset(m_hPE, PEP_bLINESHADOWS, TRUE);
  98. PEnset(m_hPE, PEP_nFONTSIZE, PEFS_LARGE);
  99. PEnset(m_hPE, PEP_bSCROLLINGHORZZOOM, TRUE);
  100. PEnset(m_hPE, PEP_nDATAPRECISION, 1);
  101.  
  102. // Improves metafile export //
  103. PEnset(m_hPE, PEP_nDPIX, 600);
  104. PEnset(m_hPE, PEP_nDPIY, 600);
  105.  
  106. //// Set Demo's RenderEngine to Gdi Plus //
  107. //CMDIFrameWnd* pWnd = (CMDIFrameWnd*)AfxGetApp()->GetMainWnd();
  108. //pWnd->SendMessage(WM_CHANGE_METAFILE, PEPLAYMETAFILEGDIPLUS);
  109. }
  110. }

效果图:

对上述代码的探究:

(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设置子集的名字。

  1. // subset labels
  2. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("Texas"));
  3. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("Florida"));
  4. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("Washington"));
  5. PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, , TEXT("California"));
  6.  
  7. // subset colors
  8. DWORD dwArray[] = { PERGB(, , , ), PERGB(, , , ), PERGB(, , , ), PERGB(, , , ) };
  9. PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, , , dwArray, );
  10.  
  11. // subset line types
  12. int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID };
  13. PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, );
  14.  
  15. // subset point types
  16. int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID };
  17. PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, );

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

  1. void CProMfcDlg::CreateSimpleSGraph()
  2. {
  3. RECT rect;
  4. GetClientRect(&rect);
  5. HWND m_hPE = PEcreate(PECONTROL_SGRAPH, 0, &rect, m_hWnd, 1001);
  6. if (m_hPE)
  7. {
  8. float fY;
  9. float fX;
  10.  
  11. PEnset(m_hPE, PEP_nSUBSETS, 4);
  12. PEnset(m_hPE, PEP_nPOINTS, 12);
  13.  
  14. for (int s = 0; s <= 3; s++)
  15. {
  16. for (int p = 0; p <= 11; p++)
  17. {
  18. fX = ((float)(p + 1)) * 100.0F + ((float)getrandom(2, 250)) / 50.0F;
  19. PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &fX);
  20. fY = ((float)(p + 1) * 1.0F) + getrandom(1, 250) + 700.0F - ((float)(s * 140.0F)) + ((float)getrandom(2, 250)) / 250.0F;
  21. PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &fY);
  22. }
  23. }
  24.  
  25. }
  26. }

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

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

未汉化时:

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

PreEssentials与MFC集成使用的更多相关文章

  1. DLL 支持MFC 没有DLLMAIN函数

    如果使用VC编写DLL时,需要MFC功能: 一般在源文件里就不能手动写DLLMAIN函数了 它给MFC集成了,\src\mfc\dllmodule.cpp打开它,里面有有一个DLLMAIN函数,根据源 ...

  2. C++的MFC,与C#的.NET

    转载:http://blog.sina.com.cn/s/blog_7f5bde5c0101hk5n.html 以下摘自各问答网站.博客论坛: [1]MFC早已过时,现在C++多数是用来编写底层方法而 ...

  3. 关于DLL的学习

    1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...

  4. 在MFC对话框中快速集成三维控件

    在MFC的对话框中可以方便的集成AnyCAD三维控件(c++版本),遵循一下几步: 1.在对话框资源中增加一个Static控件,ID为IDC_STATIC_3D,并且把它的Notify属性设置为Tru ...

  5. VC++/MFC(VC6)开发技术精品学习资料下载汇总

    工欲善其事,必先利其器,VC开发MFC Windows程序,Visual C++或Visual Studio是必须的,恩,这里都给你总结好了,拿去吧:VC/MFC开发必备Visual C++.Visu ...

  6. [MFC] VS2013版本MFC工程移植到VC6.0上

    :VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本 ...

  7. MFC学习-第4课 消息机制和MFC作图

    转自: 1.http://blog.sina.com.cn/s/blog_6b5180bf01012kbz.html 2.http://blog.csdn.net/happyhhb/article/d ...

  8. MFC学习-第2,3课 MFC框架的运行机制

    转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/ 讲述MFC AppWizard的原理与MFC程序 ...

  9. MFC中afx_msg是什么,afx_msg void function()是什么意思

    应用程序框架产生的消息映射函数例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体:而在map宏定义中,就有 ...

随机推荐

  1. 简析CSRF

    1.简介 CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF ...

  2. Ajax异步请求struts的JSON机制(省市区三级联动)

    1.struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts P ...

  3. spring 学习之二 AOP编程

    AOP概念 AOP, aspect oriented programing,翻译过来就是面向切面编程的意思,那什么叫面向切面编程呢?相对于之前传统的纵向继承方式来对原有功能进行功能扩展, 面向切面编程 ...

  4. log4j与commons-logging slf4j的关系

    1. slf4j     他只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口并没有实现     所以如果要使用就得再给它提供一个实现了些接口的日志包,     ...

  5. 【前端开发】localStorage的用法

    localStorage.setItem("name","value")  //存储name的值 var type = localStorage.getItem ...

  6. JQuery中DOM事件合成用法

    jQuery有两个合成事件——hover()方法和toggle()方法 类似前面讲过的ready()方法,hover()方法和toggle()方法都属于jQuery自定义的方法. hover()方法: ...

  7. C/C++之static

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

  8. Merkle Tree(默克尔树)算法解析

    Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶节点 ...

  9. yum安装Mysql-5.6

    MySQL yum库提供了一个简单的和方便的方法来安装和更新MySQL相关的软件包到最新版本. MySQL yum库文档说明:http://dev.mysql.com/doc/mysql-yum-re ...

  10. R vs Python:构建data.frame、读取csv与统计描述

    一.Python 数据框就是典型的关系型数据库的数据存储形式,每一行是一条记录,每一列是一个属性,最终构成表格的形式,这是数据科学家必须熟悉的最典型的数据结构. 1.构建数据框 import pand ...