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     (这就创建好了)

其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:

               -W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-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);

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

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

2.系统环境配置

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

...\MATLAB\extern\lib\win32\microsoft;

...\MATLAB\bin\win32

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

...\MATLAB\runtime\win32;

...\MATLAB\bin;

...\MATLAB\extern\lib\win32\microsoft;

...\MATLAB\bin\win32

3.vs2010环境配置

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

...\MATLAB\extern\include\

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

...\MATLAB\extern\lib\win32\microsoft

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

...\MATLAB\extern\include\

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

...\MATLAB\extern\lib\win32\microsoft

⑤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();

            }

vs 2010调用matlab dll显示窗口核心代码的更多相关文章

  1. 调用user32.dll显示其他窗口

    /// 该函数设置由不同线程产生的窗口的显示状态 /// </summary> /// <param name="hWnd">窗口句柄</param& ...

  2. go 调用windows dll 的方法

    go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...

  3. dotnetnuke 调用第三方dll出错 System.Security.Permissions.SecurityPermission,型的权限已失败。

    在dnn下调用第三方dll的微信sdk ,代码如下: WebClient wc = new WebClient();  wc.Encoding = encoding ?? Encoding.UTF8; ...

  4. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  5. VS2008 C++ 调用MATLAB 2009b 生成的DLL .

    转载: 刚开始学习用VC++调用matlab生成的DLL,找了网上一些资料,难以找到vs2008与MATLAB2009b版本的,按照以往版本做的总是有很多错误.经过两天努力,终于调试成功,这里将经验总 ...

  6. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...

  7. Codecs是以plugin的形式被调用的(显示中文的codec plugin文件是qcncodecs4.dll),可静态载入和动态载入

    作为非英语国家人员开发的类库,QT有充分的理由优先考虑支持Unicode和各国自定义字库编码.大家也知道了QT对软件Internationalization有一套完整的开发模型,包括专门为此写的lin ...

  8. C#调用Matlab生成的Dll

    问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...

  9. .net 调用 Matlab生成dll出现的问题(The type initializer for 'MathWorks​.MATLAB.NE​T.Utility.​MWMCR' threw an exception.)

    https://cn.mathworks.com/matlabcentral/answers/278399-i-get-an-error-saying-the-type-initializer-for ...

随机推荐

  1. 深入浅出seesion和cookie

    session在计算机中,尤其是在网络应用中,称为"会话控制".session 对象存储特定用户会话所需的属性及配置信息.session跟踪是Web程序中常用的技术,用来跟踪用户的 ...

  2. Android初级教程:Android中解析方式之pull解析

    在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...

  3. ExtJS学习(三)Grid表格

    表格说明 Ext中的表格功能非常强大,包括排序.缓存.拖动.隐藏某一列.自动显示行号.列汇总.单元格编辑等实用功能.表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,其xty ...

  4. Bootstrap简单HelloWorld入门教程

    这篇教程旨在让你在20分钟内学会使用twitter bootstrap创建一个站点.看完这个教程后你应该能够使用bootstrap来建立一个基本的响应式布局的页面,了解栅格系统,并且能够使用boots ...

  5. Android开发学习之路--Service之初体验

    android最后一个组件便是service了,终于学习到最后一个组件了,从年前的开发环境的搭建,到现在学到最后一个组件花了三周的时间,期间记录的点点滴滴,照着书本学习编写的代码都受益匪浅,这里要感谢 ...

  6. 07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存

     事务处理 Redis对事务的支持目前还比较简单.Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令.当一个client在一个连接中发出mul ...

  7. Mybatis源码之Statement处理器CallableStatementHandler(六)

    CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程. 源码如下: /** * @author Clinton Beg ...

  8. ADO.NET常用方法释义

    先列个列表,下面的就是常用的数据库操作的方法. ExecuteNonQuery 释义:对链接执行的SQL语句,并返回受影响的行数(注意:用它来执行目录操作,如查询数据库的结构,创建表等数据库对象,或通 ...

  9. matlab中 mcc/mbuild/mex 区别

    mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能.mcc 也可以将.m文件编译为exe可执行文件. mex 的作用是将 c/c ...

  10. 见过的最全的iOS面试题

    之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Cat ...