“Test2”是以MFC创建的对话框工程,在该对话框中调用经转换后的m文件以完成正弦函数和余弦函数曲线绘制,其实现步骤为:
(1)编写m文件“Mysin.m”和“Mycos.m”
%////////// Mysin.m 程序清单////////////
function Mysin(x1,x2)
X=x1:0.1:x2;
Y=sin(X);
plot(X,Y);
%////////// Mycos.m 程序清单////////////
function Mycos(x1,x2)
X=x1:0.1:x2;
Y=cos(X);
plot(X,Y);
//////////////////////////////////////////////
(2)创建VC工程“Test2”
运行VisualC++并单击File->New,打开Project对话框来创建Test2工程。选取MFC AppWizard (exe) (图3-7)。在loctation编辑框中输入欲创建工程的保存路径,在Project name编辑框中输入工程名如“Test2”,单击OK进入下一步工程设置对话框,选取“Dialog based”,单击Finish完成 “Test2” 工程创建。
图3-7 Test2 工程创建
(3) 转换m文件“Mysin.m”和“Mycos.m”
单击Visual MATcom工具栏上的m++图标,选择保存过的MATLAB文件Mysin.m进行转换,完成后再次单击m++图标,选择Mycos.m转换(如果有多个m文件,可逐个添加并转换)。如果看到的转化信息提示没有错误就可以观察到此时在FileView标签中多了m-files、C++files created from m-files、MATrix<lib>和External Dependencies等文件夹(图3-8)。在相应的文件夹下增加了Mycos.m、Mysin.m、Mycos.cpp、Mysin.cpp、v4501v.lib、Mycos.h、Mysin.h和matlib.h等文件。表明m文件转换成功。分别在“Mycos.h”和“Mysin.h”文件中添加头文件“matlib.h”,进行编译,若编译成功,进入下一步;否则,表明m文件中存在错误,可双击m-files目录下相应的m文件进行修改,并重新转换直到没有错误报告为止。
//////////// Mycos.h 文件清单
#include "matlib.h" ////////////////需添加"matlib.h"头文件,否则,编译时报错
#ifndef __Mycos_h
#define __Mycos_h
Mm Mycos(Mm x1, Mm x2);
#endif // __Mycos_h
//////////// Mysin.h 文件清单
#include "matlib.h" /////////////////需添加"matlib.h"头文件,否则,编译时报错
#ifndef __Mysin_h
#define __Mysin_h
Mm Mysin(Mm x1, Mm x2);
#endif // __Mysin_h
图3-8 Mysin.m和Mycos.m文件转换结果
(4)在VC工程“Test2”中调用转换后函数“Mysin”和“Mycos”
•创建如图3-9所示对话框界面,并按表3-2设置各控件属性。
表3-2 Test2对话框控件属性
| 控件属性 | 控制ID | 说明 |
|---|---|---|
| Edit Box | IDC_EDIT_x1 | 接受用户输入的左端点x1,与之相连的变量为m_x1 |
| Edit Box | IDC_EDIT_x2 | 接受用户输入的左端点x2,与之相连的变量为m_x2 |
| Button | IDC_BUTTON_MySin | 鼠标左键单击该控件,调用Mysin函数并绘制正弦曲线 |
| Button | IDC_BUTTON_MyCos | 鼠标左键单击该控件,调用Mycos函数并绘制余弦曲线 |
| Static Text | IDC_Statistic_MySin | 用于显示正弦曲线 |
| Static Text | IDC_Statistic_MyCos | 用于显示正弦曲线 |
图3-9 Test2对话框
•添加头文件:
#include "Mysin.h"
#include "Mycos.h"
#include "matlib.h"
•为IDC_BUTTON_MySin添加响应代码:
void CTest2Dlg::OnBUTTONMySin()
{
double x1,x2;
UpdateData(TRUE); ////////////////////////// 将编辑框中输入值赋给与之相连的变量
x1=(double)m_x1; x2=(double)m_x2;
CWnd* psin=(CWnd*)GetDlgItem(IDC_Statistic_MySin);
Mm plothandle=winaxes(psin->m_hWnd); ///////////读取图形句柄
initM(MATCOM_VERSION); //////////////初始化matlib库
Mysin(x1,x2); //////////////////// 调用转换生成的函数
exitM(); /////////////////////////// 退出matlib库
}
•为IDC_BUTTON_MyCos添加响应代码:
void CTest2Dlg::OnBUTTONMyCos()
{
double x1,x2;
UpdateData(TRUE); ////////////////////////// 将编辑框中输入值赋给与之相连的变量
x1=(double)m_x1; x2=(double)m_x2;
CWnd* pcos=(CWnd*)GetDlgItem(IDC_Statistic_MyCos);
Mm plothandle=winaxes(pcos->m_hWnd); ///////////读取图形句柄
initM(MATCOM_VERSION); //////////////初始化matlib库
Mycos(x1,x2); //////////////////// 调用转换生成的函数
exitM(); /////////////////////////// 退出matlib库
}
•编译链接Test2工程:
按一般的C++程序进行编译链接Test2工程,这其中,由于Mysin.h和Mycos.h函数定义文件是相应的m文件转换生成的,生新编译整个工程时,这两个文件同时重新转换,VC++询问用户外部Mysin.h和Mycos.h已发生修改,是否重新加载这两个文件时,一般选择不重新加载,因重新转换生成的Mysin.h和Mycos.h文件中,没有包含“matlib.h”头文件,需用户手动添加,若没有包含该文件,编译器不能识别Mm数据类型而发生错误。
•执行Test2.exe:
执行Test2.exe文件后,得如图3-10所示对话框,在编辑框中输入0和25(近似值),单击sin和cos按钮后,在左框中绘制了相应的曲线。
图3-10 Test2运行结果
(5)独立应用程序发布
通过MATcom把.m文件编译为为stand_alone的程序,一般不需要MATLAB系统,仅需拷贝一些必要的dll文件,这些文件主要有:v4501v.dll、ago4501.dll、icudt24l.dll以及%MATLAB%\bin\win32\目录中以lib开头的dll文件,当然,并不是每个独立应用程序都需要所有以lib开头的dll文件,只是将这些lib*.dll文件都拷贝后,较为方便。