两种Matlab图像嵌入VC界面的实现方法_第1页
两种Matlab图像嵌入VC界面的实现方法_第2页
两种Matlab图像嵌入VC界面的实现方法_第3页
两种Matlab图像嵌入VC界面的实现方法_第4页
两种Matlab图像嵌入VC界面的实现方法_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、两种Matlab图像嵌入VC界面的实现方法罗 鑫(中国电子科学研究院,北京 100041摘 要:Matlab图像无法嵌入VC程序界面是混合编程应用中的一个问题,文章通过两个实例分别介绍了两种实现方法:利用COM组件技术的窗口嵌入方法和基于COM的统一数据传输机制的方法,这两种方法都很好的实现了Matlab图像嵌入VC界面。关键词:Matlab;VC;混合编程;COM;UDT;中图分类号: TP311 文献标识码A基金项目:总装装备重点预研基金(9140A06070106DZ1001。1 引 言Matlab是MathWorks公司推出的一套功能强大的科学计算软件和科学计算语言,它拥有强大计算绘图

2、功能和众多完善的数学算法,广泛的应用于信号处理,语音处理,图像处理,电子仿真等各个科学和工业领域。由于Matlab 程序无法脱离Matlab环境运行的局限性,以及解释语言执行效率低下等原因,如何利用Matlab强大的计算、绘图功能与高级开发语言(如VC混合编程,各取所长,提高效率,开发脱离Matlab环境的应用程序,一直是科研工作者研究的热点问题。在利用VC和Matlab混合编程开发工程应用软件中,Matlab的绘图功能是除数学运算功能外应被用到最多的功能,开发人员往往利用VC部分进行数据库操作和复杂界面开发,利用Matlab部分可视化输出数据处理结果。但是在应用中有一个问题,Matlab的图

3、形只能输出在自己的Figure窗口上,无法嵌入到VC的程序界面中,混合程序在应用时只能通过在主程序窗口之外弹出一个独立的Figure 窗口来显示绘图结果,这给混合编程应用造成了很大的大障碍,不仅使混合程序的用户体验变得很差,而且在操控上更是带来很多不便,也违背了混合编程应用的初衷。本文将介绍两种Matlab图形嵌入VC界面的解决办法:利用COM组件技术的窗口嵌入方法和基于COM的统一数据传输机制的图形嵌入方法。2 COM组件和统一数据传输机制组件对象模型(COM,Componet Object Model是微软提出的以组件为发布单元的软件开发技术。COM对象用C/S的方式,提供一类应用程序接口

4、,允许任何符合标准的程序访问。COM对象是建立在二进制可执行代码的基础上,因此COM组件对象是语言无关的,这一特性使得用不同编程语言开发的组件对象进行交互成为可能。Matlab可以通过Matlab编译器和Matlab COM Builder将Matlab程序转换为动态链接库形式的COM组件,这些COM组件可以在其他程序中调用,这是VC和Matlab 混合编程的主要方式。 图 1 UDT应用剪贴板传输数据示意图COM提供了一个在应用之间数据交换的标准方案,称为统一数据传输(UDT,uniform data transfer。统一数据传输建立在结构化存储技术的基础之上,定义了两个数据结构FORMA

5、TETC和STGMEDIUM,分别用来描述数据格式和存储介质,使得它可以适应更广泛的数据类型和存储介质,既提高了效率,又节约了资源。统一数据传输中的数据对象是一个COM对象,它通过IDataObject 接口为应用程序进行数据传输建立了标准,一旦应用程序实现了一个数据对象,它就可以把此对象通过任一种传输协议传给其他的应用程序。统一数据传输的一个典型应用是剪贴板,应用程序和组件通常剪贴板来获得数据对象。统一数据传输机制应用剪贴板传输数据对象的原理如图 1所示。在数据源程序一方,首先构造一个COleDataSource对象,然后调用CacheGlobalData或者GetData成员函数,用格式和

6、数据填充其内部的格式缓冲区,当我们调用SetClipboard成员函数时,数据对象被拷贝到剪贴板上;在客户程序一方,我们调用AttachClipboard函数,它把剪板上的IDataObject接口指针与COleDataObject对象联系起来,之后我们调用GetData或者GetGlobalObject函数就可以得到每种格式的数据。3基于COM组件的窗口嵌入方式实现方法Windows系统中所有应用程序的窗口都是基于MFC类库中CWnd类的。CWnd类有3个对操作窗口的函数:FindWindow、SetWindowPos和SetParent,其中FindWindow可以寻找到Windows系统

7、中指定名称的窗口;SetWindowPos能把窗口移动到指定的位置;而SetParent函数可以改变窗口的父窗口。利用这3条命令的组合,从理论上讲可以将系统中的任何一个窗口变成另外一个窗口的子窗口并“嵌入”到其中。这给Matlab和VC混合编程中将Matlab产生的图像和VC程序界面无缝集成提供了一条可行的途径:首先,用Matlab程序产生一个不可见的Figure窗口,然后找到这个Figure窗口的句柄,将Figure 窗口设为VC程序的子窗口,去掉Figure窗口边框并移动到指定位置,设置Figure窗口为可见。为了能在VC程序中调用Matlab的绘图功能并控制Matlab绘图,就要用到上面

8、介绍的COM组件技术。下面通过一个简单的实例来说明利用COM组件技术将Matlab图像嵌入VC界面的实现方法。在这个混合编程应用例子中,我们需要用VC控制参数的改变来控制Matlab产生不同参数的泊松分布图像。我们编写一个Matlab函数文件guitest1.m,它的功能是产生一个不可见的Figure图像窗口,可以通过参数的改变改变图像和控制窗口可见。function guitest1(LAMBDA,Ctrlx=0:1:100;y=poisspdf(x,LAMBDA;switch Ctrlcase 0 %产生一个名为“_guitest_”的不可见Figure窗口figure('Numb

9、erTitle','Off','Name','_guitest_','Visible','Off'case 1 %将Figure窗口设置为可见h=gcf;set(h,'Visible','On'endplot(x,y,'r'在Matlab7.04环境中运行>> mcc -W cpplib:GuiTestLib -T link:lib guitest1,将guitest1.m转换为COM组件。用Visual C+ 6.0编写一个基于对话框的MFC应用

10、程序工程,把COM组件加入工程,为其添加一个用于显示图像的按钮、一个用于标志图像显示位置的图片控件、及一对控制参数的编辑控件和微调控件。其中调用COM组件将Figure窗口嵌入VC界面的代码如下:guitest1(lambda,ctrl0; / 调用COM组件产生一个不可见Figure窗口char FigName="_guitest_"HWND hFig = :FindWindow(NULL,FigName; / 获得Figure窗口句柄long lStyle = :GetWindowLong(hFig,GWL_STYLE; / 去掉Figure窗口的标题栏和边框:SetW

11、indowLong(hFig,GWL_STYLE,lStyle & (WS_CAPTION & (WS_THICKFRAME;:SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIV ATE | SWP_FRAMECHANGED;RECT PlotRec; / 获取绘图区域的位置和大小CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA;PlotArea->GetWindowRect(&PlotRec;long Width =

12、 PlotRec.right - PlotRec.left;long Height = PlotRec.bottom - PlotRec.top;:SetParent(hFig,PlotArea->GetSafeHwnd(;/ 设置Figure窗口为VC界面的子窗口并调整位置:SetWindowPos(hFig,NULL,1,1,Width-3,Height-3,SWP_NOZORDER | SWP_NOACTIV ATE;guitest1(lambda,ctrl1; /调用COM组件将Figure窗口显示出来调用Matlab产生的COM组件时,需要将VC中的参数转换为mwArray格式

13、,可以参考Matlab 文档,由于不是实现方法的重点,本文不再详述。这样就通过一个COM组件和VC程序相配合实现了Matlab图像嵌入VC界面,通过VC改变控制参数还可以控制图像的变化。运行结果如图2所示 图 2 Matlab图像嵌入VC界面效果图4利用COM的统一数据传输机制的实现方法Matlab产生的输出图像可以通过Matlab的print命令输出为JPEG、BMP、PNG等各种格式的图片文件,还可以将图像以图片格式输出到Windows系统的剪贴板中供其它程序调用。这些命令如下: Print dbmp filename /将Figure中的图形输出为filename.bmp文件;Print

14、 djpeg filename /将Figure中的图形输出为filename.jpeg文件;Print dmeta /将Figure中的图形输出到系统剪贴板中;这几条命令给Matlab和VC混合编程中将Matlab产生的图像嵌入VC程序界面提供了又一条可行的途径。我们可以利用Matlab程序绘制数据图像,并使用print命令将图像输出为图片文件或输出到剪贴板。现在的问题是VC程序如何获取到Matlab程序产生的图片文件或剪贴板中的图像输出,这涉及到了应用之间数据传输的问题,就用到了COM组件的统一数据传输机制。下面我们通过一个例子,以最为便捷的读取剪贴板的方式实现Matlab图像嵌入VC界面

15、的混合编程。在这个例子中,我们需要用一个Matlab程序GDATcore.m来以隐藏窗口的方式显示数据拟合图像,并将图像输出到剪贴板中。GDATcore.m带有4个输入参数:拟合函数选择参数fuc、拟合函数的两个参数k1、k2,以及采样间隔dist(具体程序在此省略。我们在Matlab命令窗口下运行>> mcc -W cpplib:GDATcoreLib -T link:lib GDATcore,将GDATcore.m转换为一个动态连接库形式的COM组件。用Visual C+ 6.0编写一个控制GDATcore参数的MFC应用程序工程,把编译好的COM组件加入工程,添加控制GDAT

16、core.m4个参数的相关控件,并添加一个定位图像显示的图片控件。工程中有一个继承至CStatic类的CDisplayFigure类,它通过一个私有CDC成员变量memDC来保存图像更新区域,函数Display实现把剪贴板中的图形显示在图片控件所在位置的功能。Display的实现代码如下:CClientDC dc(this;CRect client_rect;GetClientRect(&client_rect;CBitmap bitmapFigure;if ( memDC.GetSafeHdc( = NULL /设置图像放置位置memDC.CreateCompatibleDC(&am

17、p;dc;bitmapFigure.CreateCompatibleBitmap(&dc,client_rect.Width(, client_rect.Height( ;memDC.SelectObject(&bitmapFigure;COleDataObject DataObject; /构造COleDataObject对象用来获取剪贴板中的图形DataObject.AttachClipboard(;HGLOBAL hBmp = DataObject.GetGlobalData(CF_METAFILEPICT; /获得图片的句柄LPMETAFILEPICT lpBmp =

18、(LPMETAFILEPICT:GlobalLock(hBmp;memDC.SetMapMode(lpBmp->mm; /设置显示模式memDC.SetViewportExt(client_rect.Width(, client_rect.Height( ;memDC.SetViewportOrg(client_rect.left, client_rect.top ; /设置显示位置memDC.PlayMetaFile(lpBmp->hMF ; /放置图像Invalidate(; /更新窗口图形使用这个类时我们需要创建一个类对象并用一个图片控件的位置来指定图像输出位置,在程序中还需

19、要加入下面的代码:CDisplayFigure myfig;myfig.SubclassDlgItem(IDC_STATIC_FIG,this;GDATcore(fuc,k1,k2,dist; /调用组件产生新图像myfig.Display(; /显示图像这样,我们就利用统一数据传输机制实现了从剪贴板获得图像并输出在VC界面上,在程序中我们可以通过VC界面控件改变参数,然后调用Matlab组件输出图像到剪贴板,VC程序通过CDisplayFigure类将图像输出到指定的控件位置。实际程序运行如图3所示: 图 3 实际程序运行图5 结语从两个示例的运行结果可以看到,这两种方法都能很好地将Matl

20、ab图形嵌入VC程序界面中。利用这两种实现方法,Matlab和VC混合编程应用中就可避免在程序窗口之外跳出一个独立的图像输出窗口的情况,这给混合编程的在工程上的应用带来很大的便利,同时也给其它应用提供了一个实现数据图形绘制的途径。本文作者创新点:在第一个方法中,利用COM组件的方式而不是直接调用Matlab底层C函数实现控制Figure窗口的隐现和图形变化,易于实现;在第二个方法中,利用COM组件的UDT机制,可以克服直接读取剪贴板图片不能太大的缺点,更可扩展为读取磁盘文件或远程图片的实现。参考文献1 张志涌.精通MATLAB6.5版M.北京航空航天大学出版社.20032 董国维.深入浅出MATLAB7.x混合编程M.机械工业出版社.20063 潘爱民.COM原理及应用M.清华大学出版社.20034 苗春葆.MATLAB与VC混合编程J.中国仿真科技论坛电子期刊.第一期5 牟彧清,王汝霖,李国新.MATLAB与VC接口技术的研究J,微计算机信息,2006,7-3:P275-277。6 袁佑新,甘伟.Matlab与VC混合编程在网架结构智能监测系统中的应用J ,微计算机信息,2006,1-1:P103-105。Two Solutions to Integrate Matlab Figures with VC In

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论