文档章节

基于COM的Matlab 图像嵌入MFC界面

曾劲松
 曾劲松
发布于 2016/08/07 17:02
字数 901
阅读 123
收藏 0

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文件

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_");
	static	HWND 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

本文转载自:

共有 人打赏支持
曾劲松
粉丝 4
博文 200
码字总数 141434
作品 0
武汉
私信 提问
加载中

评论(1)

w
wxhwm
写的很详细,但是我在用您的代码的时候没有成功,首先mclInitializeApplication这里在vs中说没有定义,所以我把他注释掉了,然后编译通过了但是在调试时guitest1(mw_hid);在这句调试的时候有一个异常,然后不能继续向下运行了,这可能是什么问题?
c++调用matlab生成的Dll动态连接库

点击打开链接 http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台: matlab 7.0(R2009a) VC++6.0 思路: 1. 设置matlab的编译器,使用外部的V...

长平狐
2012/10/08
2.6K
0
stm32f103单片机OV7725RGB图像处理程序(识别橘黄色乒乓球)

经过几天的努力,实现了在stm32单片机的RGB565图像简单处理,识别橘黄色乒乓球,同时单片机通过串口向上位机输出,乒乓球的重心坐标,和与图像中心线的夹角,在者可以输出的RGB565数据,通过...

qq_34675909
2018/01/27
0
0
Mathworks资深应用工程师王鸿钧:仿真加速自动驾驶功能的开发 | 2018全球智能驾驶峰会

Mathworks资深应用工程师 王鸿钧 雷锋网新智驾按:10月26日至27日,2018 全球智能驾驶峰会在苏州召开,本次峰会由苏州市相城区人民政府主办,苏州高铁新城管理委员会、雷锋网&新智驾和数域承...

陈小同
2018/10/29
0
0
C/C++开发求职

个人简介: 本人98年公费中等师范毕业后分配去大山中教书育人,为期三年。学历有限。 以后所学,庞杂多端。06年左右开始接触数值算法编程,学习了各种数学软件(如matlab,mathematica,maple)...

numcpp
2012/03/06
955
2
STL,ATL,WTL之间的联系和区别

STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它...

AlphaJay
2010/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ToolBar控件在C#开发APP中的使用方式【附案例源码】——Smobiler移动开发平台

控件说明 底部工具栏控件。 效果演示 其他效果 该界面为仿淘宝UI制作的一个简单的UI模板,源码获取方式请拉至文章末尾。 特色属性 属性 属性说明 Direction(相对布局) 容器主轴方向。 Flex...

amanda112
25分钟前
1
0
模块

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等...

gtandsn
32分钟前
1
0
代码之外的生存指南,这6本书助你提升软实力

上期盟主向大家推荐了6本技术类书籍,引起了热烈反响。那么,工作之余,还有哪些好书能够为你打开更多的精彩世界呢?本期,多位知名企业的技术大咖将继续为您带来好书推荐,在新的一年里,为...

安卓绿色联盟
35分钟前
3
0
5分钟用Jitpack发布开源库

作者: 菜刀文 Demo:https://github.com/helen-x/JitPackReleaseDemo 项目开发中会用到很多开源库, 他们一般通过Maven/Gradle依赖进来的. 演而优则唱,开发越来越溜以后, 你是否也蠢蠢欲动,想发...

SuShine
41分钟前
2
0
状态码 301 与 302的区别

302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。 而301重定向是永久的重定向,搜索引擎在抓取新的内容的同...

小草先森
47分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部