• vs 2010调用matlab dll显示窗口核心代码


     matlab代码:

    figure('NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); 
    x=0:pi/100:2*pi;
    y=2*exp(-0.5*x).*sin(2*pi*x);
    plot(x,y)
    %figure(1); 
    
    %%
    %figure('Visible','off')
    %plot([1:100])
    %figure(1)
    


     

     

     

    代码下面有,添加滚动条的窗口,这个地方主要是一个事件,点击按钮后,调用matlab代码生成的dll进行运算,完后显示的结果窗口显示出来,完后移动窗口到指定位置

    void Cmdi_matlab_movewindow20140810View::OnMatlab()
    {
    	// TODO: 在此添加命令处理程序代码
    // 	CProcessCtrl m_process;
    // 
    // 	m_process.DoModal();
    	CProcessCtrl *m_process = new CProcessCtrl();
    	m_process->Create(IDD_PROCESS,this);
    	m_process->ShowWindow(SW_SHOW);
    	m_process->m_processctrl.SetPos(10) ;
    
    	if( !myfunInitialize())
    	{
    		MessageBox(_T("初始化失败"));
    	}
    
    	
    	m_process->m_processctrl.SetPos(30) ;
    	fun();
    
    	// terminate MCR
    	mclTerminateApplication();
    	CString wnd_name = "Topo Image";
    
    	m_process->m_processctrl.SetPos(40) ;
    
    	HWND hFig=::FindWindow(NULL,wnd_name);//wnd_name为matlab figure的名称,
    	//此处需循环多次才能得到句柄,不知为啥
    	while(hFig==NULL)
    	{
    		hFig=::FindWindow(NULL,wnd_name);
    
    	}
    	m_process->m_processctrl.SetPos(60) ;
    	//::ShowWindow(hFig, SW_HIDE); 
    	ModifyStyle(hFig,WS_POPUP,WS_CHILD,NULL); 
    
    	
    
    	long IStyle=::GetWindowLong(hFig,GWL_STYLE); //获得figure的属性
    	
    	//ModifyStyle(hFig,WS_POPUP,WS_CHILD,NULL); 
    
    	//CWnd* pMainWnd =AfxGetMainWnd();
    	//CRect client_rect;
    	CRect figure_rect;
    	CWnd *myfigure = GetDlgItem(IDC_STATIC_MATLABWND);
    
    	myfigure->GetClientRect(&figure_rect);
    	//pMainWnd->GetClientRect(&client_rect);
    
    	long fig_width=figure_rect.Width();
    	long fig_height=figure_rect.Height();
    
    	
    	m_process->m_processctrl.SetPos(80) ;
    
    	::SetParent(hFig,myfigure->GetSafeHwnd());//设置figure的父窗口
    	::SetWindowLong(hFig,GWL_STYLE,IStyle & (~WS_CAPTION) & (~WS_THICKFRAME));//设置figure的属性,去掉标题栏
    	
    	::SetWindowPos(hFig,NULL,0,0,fig_width,fig_height,SWP_NOZORDER|SWP_NOACTIVATE);//
    
    	m_process->UpdateData(false);
    	m_process->DestroyWindow();
    
    	::ShowWindow(hFig,SW_SHOW);  //显示设置完后的figure
    	::SetForegroundWindow(this->m_hWnd);
    
    
    	//::UpdateWindow(hFig); //刷新
    	//::UpdateWindow(myfigure->m_hWnd); //刷新
    
    
    }

    实现效果:


     

    之前配置的过程主要参考了下面的链接:

    http://blog.csdn.net/stardust94605/article/details/8972064

    下面是文章内容:

     


    思路:为了实现matlab与C++混合编程,采用由m文件构造动态链接库然后在visual studio中调用的方法。

    本人系统:Windows 7旗舰版(32位),VS2010旗舰版,Matlab R2012b    只有R2010b或以上版本才识别VS2010编辑器

     

    1. matlab中dll创建

             1.1    m文件编写

              function [ yt ] = myfitline( x,y,m,xrange,t )
             %xy为坐标向量,m为多项式阶数,xrange为显示图上面的坐标范围,t为要求的坐标横轴位置
             %   Detailed explanation goes here
             p=polyfit(x,y,m);%计算各阶系数p1x^m+p2x^(m-1)+....+ pmx+ p(m+1)
             yy=polyval(p,xrange);%计算一个区域内的函数值用于画图
             yt=polyval(p,t);   %  计算指定x下的函数对应的y值
             plot(x,y,'r*',xrange,yy,'b')
             end

            1.2   设置编译器

                         >> mex -setup   选择VS2010

                         >> mbuild -setup  选择VS2010

                         >> mcc -W cpplib:Myfitline -T link:lib myfitline     (这就创建好了)

                  其中,mccMatlab提供的编译命令,对于这一点,Matlab的帮助说明如下:
                   -W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++libcpplib冒号后面是指编译的库的名字,-T表示目标,

           link:lib表示要连接到一个库文件的目标,目标的名字是后面的myfitline,即你写的m函数的名字。
                  运行完之后,你的目录下面,将会出现以下一些文件:
                  Myfitline.cpp
                  Myfitline.exp
                  Myfitline.dll
                  Myfitline.exports
                  Myfitline.h
                  Myfitline.lib
                  mccExcludedFiles.log
                  readme.txt
                  具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:
                  Myfitline.dll是编译好的动态库,myfitline这个函数封装在里面,Myfitline.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件,

           在这个头文件的最后,你可以看到下面的内容:
                  extern LIB_Myfitline_CPP_API void MW_CALL_CONV myfitline(int nargout, mwArray& yt, const mwArray& x,
                  const mwArray& y, const mwArray& m, const mwArray& xrange, const mwArray& t);             

                  这就是myfitlineC函数的声明。nargout表示输出变量的个数,其他就是对应了m函数的几个变量。


                  注意,变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。

     

    2.系统环境配置

     

                  Computer Properties -> Advanced system settings -> Environment Variables -> User Variables -> path, 添加(MATLAB下为MATLAB 2012软件安装目录)

                  ...MATLABexternlibwin32microsoft;

                  ...MATLABinwin32

                  Computer Properties -> Advanced system settings -> Environment Variables -> System Variables -> path, 添加

                  ...MATLAB untimewin32;

                  ...MATLABin;

                  ...MATLABexternlibwin32microsoft;

                  ...MATLABinwin32


    3.vs2010环境配置

     

                ①Property Pages -> VC++ Directories -> Include Directories, 添加(安装目录下)

                ...MATLABexterninclude 

                ②Property Pages -> VC++ Directories -> Library Directories, 添加

                ...MATLABexternlibwin32microsoft

                ③Property Pages -> C/C++ -> General -> Additional Include Directories, 添加

                ...MATLABexterninclude

                ④Property Pages -> Linker -> General -> Additional Library Directories, 添加

                ...MATLABexternlibwin32microsoft

               ⑤Property Pages -> Linker -> Input -> Additional Dependencies, 添加

                              libeng.lib

                              libmat.lib

                              libmex.lib

                              libmx.lib

                              mclmcrrt.lib

                              mclmcr.lib

                              Myfitline.lib

        4.vs2010下完成程序

                   把刚才生成的*.h *.dll *.lib文件复制到刚刚新建的工程的文件夹下,并且用添加—现有项添加的工程中。(此处的*代表你的m文件名称

                   调用函数 myfitline的文件前要

                                #include "mclmcr.h"

                                #include "matrix.h"

                                #include "mclcppclass.h"

                                #include "Myfitline.h

                  具体程序如下:

                  void CNewFeatureofStormView::Onposition()
                {
                     // TODO: 在此添加命令处理程序代码
                     if( !MyfitlineInitialize())
                     {
                         MessageBox(_T("初始化失败"));
                      }
                     // 为变量分配内存空间,可以查帮助mwArray
                      mwArray mwX(5, 1, mxDOUBLE_CLASS); // 5,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,
                      mwArray mwY(5, 1, mxDOUBLE_CLASS);//为了和Cpp变量接轨,设置成1*5的矩阵,mxDOUBLE_CLASS表示变量的精度)
                      mwArray mwM(1, 1, mxDOUBLE_CLASS);
                      mwArray mwXR(50,1, mxDOUBLE_CLASS);
                      mwArray mwYT(1,1, mxDOUBLE_CLASS);
                      mwArray mwT(1,1, mxDOUBLE_CLASS);
                      int x[5]={432,435,438,441,443};    //样本点坐标
                      int y[5]={136,138,140,145,147};    //
                      int xr[50],m=3,t=446;           //参数设置
                      for (int i=400;i<450;i++)
                      {
                          xr[i-400]=i;
                      }
                      mwX.SetData(x, 5);      //调用类里面的SetData函数给类赋值
                      mwY.SetData(y, 5);
                      mwM.SetData(&m, 1);
                      mwXR.SetData(xr, 50);
                      mwT.SetData(&t, 1);
                      myfitline(1,mwYT,mwX,mwY,mwM,mwXR,mwT);
                      double c = mwYT.Get(1, 1); //调用类里面的Get函数获取取函数返回值
                      CString strNumber;
                      strNumber.Format(_T("%lf"),c);
                      MessageBox(strNumber, _T("坐标"));
                      // 后面是一些终止调用的程序
                      MyfitlineTerminate();
                      // terminate MCR
                     mclTerminateApplication();
                }

     

     

  • 相关阅读:
    Java集合源码分析(一)
    EffectiveJava——请不要在代码中使用原生态类型
    Dubbo初探
    EffectiveJava——用函数对象表示策略
    EffectiveJava——类层次优于标签类
    notebook1.md
    NoteBook学习(二)-------- Zeppelin简介与安装
    Spark2.0学习(三)--------核心API
    Spark2.0学习(二)--------RDD详解
    Spark2.0学习(一)--------Spark简介
  • 原文地址:https://www.cnblogs.com/wangyaning/p/4237000.html
Copyright © 2020-2023  润新知