作者:朱金灿

来源:http://blog.csdn.net/clever101

IDL是一种数据分析和图像化应用程序及编程语言,先由美国ITT公司所有。最初在七十年代后期用于帮助科学家分析火星探险卫星发回的数据,将浩瀚的数据转换为图形。从此后,IDL 得到广泛运用,使用者日众,呈几何级别增长。

IDL 使用者可以迅速且方便地运用此软件将数据转换为图象,促进分析和理解。通过软件转化的图像既可以是简单色彩,也可以是全色三维图像和模型。

IDL的优点是用来开发算法非常方便,但是用它来开发界面不太方便,而且不太美观。因此业界倾向于用传统的C#、C++语言来开发界面,用IDL来开发算法。今天简单谈谈C++调用IDL的做法。

据搜到的网上文章:IDL与C#集成的几种方式(一)IDL与C#集成的几种方式(二)介绍C#集成IDL程序有三种方式:IDLDrawWidget draw方式(窗口模式)、COM_IDL_Connect(nodraw方式)和通过IDLEXBR_ASSISTANT输出程序DLL调用。据我的初步使用体会,通过IDLEXBR_ASSISTANT输出程序DLL调用的方式是比较落后的调用方式,理由是IDLDrawWidgetdraw方式和COM_IDL_Connect方式均支持直接调用sav文件和实时编译pro文件,IDLEXBR_ASSISTANT输出程序DLL需要一一指定导出接口的com类型,同时idl源码有所变动后又得重复导出dll,步骤如此繁琐估计不会被程序开发者所接受。关于第三种方式,网上有一篇文章作了详细介绍:VisualStudio2005 C++调用IDL导出的COM组件步骤,此处不作详述。

今天简单介绍下IDLDrawWidget draw方式(窗口模式)的做法。

第一步是注册idldrawx3.ocx。该文件一般在ENVI安装文件夹下的bin\bin.x86文件夹下。注册命令为:regsvr32 D:\Program Files\ITT\IDL64\bin\bin.x86\idldrawx3.ocx。(注意这里ocx文件依据你的envi安装路径而定)。

第二步是建一个基于MFC的对话框程序,然后在对话框资源上选择“插入ActiveX控件”,如下图:

选择IDLDrawWidget Control 3.0,然后单击确定,如下图:

添加IDLDrawWidget Control 3.0很可能出现添加代码元素失败的错误,或者即使新增加一个头文件或cpp文件或者是空白文件,或者是缺少应用的接口说明,我在多台机子上使用VS2008均出现过这个问题。我估计这是IDLDrawWidgetControl 3.0没有及时更新,不能和VS2008配合使用的缘故。我的解决办法是删除新加的头文件和cpp文件(如果有的话),然后到网上下载一个vc调用IDL的例程,把里面的idldrawx3.h和idldrawx3.cpp加到工程来。

接着为新加的ActiveX控件增加一个变量,如下图:

到了添加代码的阶段了。在调用IDL程序之前需要设置授权文件的路径,代码如下:

  1. TCHAR szProgPath[_MAX_PATH];
  2. ::GetModuleFileName(NULL,szProgPath, sizeof(szProgPath)/sizeof(TCHAR));
  3. std::string PathName = szProgPath;
  4. PathName = PathName.substr(0,PathName.rfind('\\'));
  5. PathName = PathName.substr(0,PathName.rfind('\\')) + "\\IDL70\\IDL7.0.lic";
  6. SetEnvironmentVariable("LM_LICENSE_FILE",PathName.c_str());

然后在对话框类中的控件变量CIDLDrawX3  m_IDLDrawX来调用sav文件,代码如下:

  1. BOOL CIdlShowDlg::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4. TCHAR szProgPath[_MAX_PATH] = {0};
  5. ::GetModuleFileName(NULL,szProgPath, sizeof(szProgPath)/sizeof(TCHAR));
  6.  
  7. std::string PathName = szProgPath;
  8. PathName = PathName.substr(0,PathName.rfind('\\'));
  9. PathName = PathName.substr(0,PathName.rfind('\\'));
  10.  
  11. std::string strIdlDllPath = PathName+ std::string("\\IDL70\\bin\\bin.x86\\idl.dll");
  12. m_IDLDrawX.SetIdlPath(strIdlDllPath.c_str());
  13.  
  14. RECT Rect;
  15. m_IDLDrawX.GetWindowRect(&Rect);
  16. m_IDLDrawX.SetXsize(Rect.right - Rect.left);
  17. m_IDLDrawX.SetYsize(Rect.bottom - Rect.top);
  18. m_IDLDrawX.SetXviewport(Rect.right - Rect.left);
  19. m_IDLDrawX.SetYviewport(Rect.bottom - Rect.top);
  20.  
  21. //m_IDLDrawWidget.SetOutputWnd((long) m_IDLOutputLog.m_hWnd);
  22. m_IDLDrawX.InitIDL((long) m_hWnd);
  23.  
  24. long i = m_IDLDrawX.CreateDrawWidget();
  25. if (i == -1)
  26. return TRUE;
  27.  
  28. std::string strFullpath = std::string("restore,'")+m_IDLLibPath+std::string("dist.sav'");
  29. lRet = m_IDLDrawX.ExecuteStr(strFullpath.c_str());
  30. m_IDLDrawX.ExecuteStr("plot,dist(100)");
  31. return TRUE; // return TRUE unless you set the focus to a control
  32. }

效果图如下:

参考文献:

1.      IDL语言简介

2.      IDL与C#混合编程技术

3.      C#调用IDL时传递参数或变量时字符串过长出错的解决方法

C++调用IDL程序的做法(一)的更多相关文章

  1. C++调用IDL程序的做法(三)

     作者:朱金灿 来源:http://blog.csdn.net/clever101 在C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法.假如我 ...

  2. C++调用IDL程序的做法(二)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 上次提到使用IDLDrawWidget Control 3.0来调用IDL程序,但是我们还有一些问题没有解决,比如C+ ...

  3. Java调用IDL方法总结

    Java调用IDL方法总结 Java调用IDL程序,需要先在java中加载IDL的java包(javaidlb.jar),该包不需要下载,在IDL的安装目录中可以直接找到(C:\Program Fil ...

  4. MATLAB调用C程序、调试和LDPC译码

    MATLAB是一个很好用的工具.利用MATLAB脚本进行科学计算也特别方便快捷.但是代码存在较多循环时,MATLAB运行速度极慢.如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行 ...

  5. 在ORACLE触发器里调用JAVA程序

    因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 publ ...

  6. C/C++程序通过动态链接库调用MATLAB程序

    C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然 ...

  7. C#调用java程序

    前言: 最近跟项目组的人合作一个项目,由于之前我用的是java写的一个与android通信的程序,现在另一个同事来编写界面程序,由于C#编写起来比较方便,而我又不想重新写之前java的那段代码,于是需 ...

  8. LoadRunner调用Java程序—性能测试-转载

    LoadRunner调用Java程序—性能测试   为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...

  9. 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码

    直接拨号.将电话号码传入拨号程序.调用拨号程序.调用系统浏览器浏览网页.调用系统程序查看联系人.显示系统设置界面和显示Wi-Fi设置界面代码 拨打号码的代码如下: Intent callIntent= ...

随机推荐

  1. (转)iptables详细教程:基础、架构、清空规则、追加规则、应用实例

    转自:http://lesca.me/archives/iptables-tutorial-structures-configuratios-examples.html iptables防火墙可以用于 ...

  2. LoadRunner--录制手机APP脚本

    通过LR录制手机脚本的方式有三种: 1)通过安卓模拟器录制: 2)通过抓包录制: 3)通过代理方式录制: 本文使用第二种方式进行录制,首先需要先安装LoadRunner11测试工具,然后安装lr录制A ...

  3. [D3] Select DOM Elements with D3 v4

    Before you can create dazzling data driven documents, you need to know how D3 accesses the DOM. This ...

  4. zoj 2724 Windows Message Queue 优先队列

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1724 题目大意: 给出两种操作,GET要求取出当前队首的元素,而PUT会输入名 ...

  5. [Angular 2] BYPASSING PROVIDERS IN ANGULAR 2

    Artical --> BYPASSING PROVIDERS IN ANGULAR 2 Here trying to solve one problem: On the left hand s ...

  6. outlook vba 2

  7. HTML/CSS 选择符优先级

    CSS的选择符优先级 1.同级样式默认后者覆盖前者 2.样式优先级 类型(1) < class[type](10)=伪类(10) < id(100) < style行间样式(1000 ...

  8. 最简单的基于FFmpeg的移动端样例:IOS HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  9. 常用有效检测数据库运行状态SQL脚本

    1.查看数据库中不为 InnoDB 引擎的表   SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE   FROM information_schema.TABLES  W ...

  10. [GraphQL] Write a GraphQL Mutation

    In order to change the data that we can query for in a GraphQL Schema, we have to define what is cal ...