mfc添加控件调用matlab,基于COM的Matlab 图像嵌入MFC界面

1.生成 guitest1.m 文件

function guitest1( ctrl1 )

x=-1:0.01:1;

y=x.^2;

switch ctrl1

case 0 %产生一个名为“_guitest1_”的不可见窗口

figure('NumberTitle','Off','Name','_guitest1_','Visible','Off');

case 1 %将figure设置为可见

h=gcf; % gcf返回当前Figure对象的句柄值

set(h,'Visible','On');

end

plot(x,y,'r');

end

2.编译,注意:在MATLAB环境执行时,VS不能是运行的。

mcc -W cpplib:GuiTestLib -T link:lib guitest1 -C

//不加 -C 不会生成 GuiTestLib.ctf文件

e001752bd178332511eab6c948725534.png

3.新建项目,MFC项目引入外部库文件目录设置等

// C/C++附加包含目录:

D:\MATLAB2016a\extern\include

// 链接器--常规--附加库目录

D:\MATLAB2016a\extern\lib\win64\microsoft

// 链接器--输入--附加依赖项((中间必须是回车分开,回车以后自动生成分号,不是空格键,也不是手动添加分号)

mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib libmex.lib GuiTestLib.lib

4.将生成的.dll,.h,.ctf,.lib四个文件拷贝到vs项目下(生成.exe后还需要将dll拷贝到exe所在文件夹下)。MFC项目中加入

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "myaddtestlib.h"  。在项目中调用MATLAB生成的函数时,注意查看.h文件中函数声明(在最后一行)。

5.MFC添加名为 IDC_PLOTAREA 的图片控件,并添加一个按钮以及设置相应函数:

void CmatcomDlg::OnBnClickedButton1()

{

//调用Matlab产生的COM组件时,需要将VC中的参数转换为mwArray格式

static double gui_hid = 0;

static double gui_show = 1;

// 为变量分配内存空间,可以查帮助mwArray

// 1,1表示矩阵的大小(mxDOUBLE_CLASS表示变量的精度)

static mwArray mw_hid(1, 1, mxDOUBLE_CLASS);

static mwArray mw_show(1, 1, mxDOUBLE_CLASS);

mw_hid.SetData(&gui_hid, 1);

mw_show.SetData(&gui_show, 1);

// 调用COM组件产生一个不可见Figure窗口

//dll对应的.h头文件最后关于guitest1函数声明(有返回值时与.m形参不同)

//我们的项目中是:extern LIB_GuiTestLib_CPP_API void MW_CALL_CONV guitest1(const mwArray& ctrl1);

guitest1(mw_hid);

CString FigName =_T("_guitest_");

staticHWND hFig = ::FindWindow(NULL, FigName); // 获得Figure窗口句柄

static long lStyle = ::GetWindowLong(hFig, GWL_STYLE);//获得窗口样式

// 去掉Figure窗口的标题栏和边框

::SetWindowLong(hFig, GWL_STYLE, lStyle & (~WS_CAPTION) & (~WS_THICKFRAME));

::SetWindowPos(hFig, NULL, 0, 0, 0, 0, SWP_NOMOVE |

SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE| SWP_FRAMECHANGED);

//获取绘图区域的位置和大小

RECT PlotRec;

static CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA);

PlotArea ->GetWindowRect(&PlotRec);

long Width = PlotRec.right - PlotRec.left;

long Height = PlotRec.bottom - PlotRec.top;

// 设置Figure窗口为VC界面的子窗口并调整位置

::SetParent(hFig, PlotArea ->GetSafeHwnd());

::SetWindowPos(hFig, NULL, 1, 1, Width - 3, Height - 3, SWP_NOZORDER | SWP_NOACTIVATE);

//调用COM组件将Figure窗口显示出来

guitest1(mw_show);

}

在OnInitDialog()中添加以下的代码:

bool res = false;

res = mclInitializeApplication(NULL,0);

if (!res) {

/*DWORD errNO = GetLastError();

CString errString;

errString.Format(_T("mclInitializeApplication() is wrong with %d"), errNO);

AfxMessageBox(errString);*/

AfxMessageBox(_T("mclInitializeApplication() is wrong!"));

}

res = GuiTestLibInitialize();

if (!res) {

/*DWORD errNO = GetLastError();

CString errString;

errString.Format(_T("GuiTestLibInitialize() is wrong with %d"), errNO);

AfxMessageBox(errString);*/

AfxMessageBox(_T("GuiTestLibInitialize() is wrong!"));

}

添加ondestroy消息处理函数:

// TODO: 在此处添加消息处理程序代码

bool res1;

res1 = mclTerminateApplication();

if (!res1) {

/*DWORD errNO = GetLastError();

CString errString;

errString.Format(_T("mclInitializeApplication() is wrong with %d"), errNO);

AfxMessageBox(errString);*/

AfxMessageBox(_T("mclTerminateApplication() is wrong!"));

}

GuiTestLibTerminate();

6.一定要分清x86和x64的区别,分别设置附加依赖项,同时编译时一定要选择x86还是X64.

在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,两者都有定义。即在 VC 下,_WIN32 一定有定义。

因此,WIN32/_WIN32 可以用来判断是否 Windows 系统(对于跨平台程序),而 _WIN64 用来判断编译环境是 x86 还是 x64。

7.// 链接器--输入--附加依赖项((对于VS2015,中间必须是回车分开,回车以后自动生成分号,不是空格键,也不是手动添加分号),我就是这里搞错了,才走了那么多弯路。

mclmcrrt.lib; libmx.lib ;libmat.lib ;mclmcr.lib; GuiTestLib.lib

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值