(1)创建mccdemo2.m文件,内容如下:
function mccdemo2(rectsize)
Width = rectsize(1);
Hight = rectsize(2);
figure('visible','off','Units','points','Position',[0 0 Width Hight],...
'PaperUnits','points','PaperPosition',[0 0 Width Hight]);
x=-5:0.1:5;
y=sin(x);
plot(x,y);
ylabel('y');
xlabel('x');
print -dmeta;
close(gcf)
该程序首先创建一个不可见的Figure窗口,然后进行绘图操作,输入参数是个1x2的数组,单位为像素,分别表示绘制图形的宽和高.利用print 命令将绘制的图像复制到Windows剪贴板上,从而可以有MFC程序使用此数据在MFC界面上实现绘制。
(2)在MATLAB命令行下,将mccdemo2.m编译成C++动态链接库文件,执行如下命令:
>> mcc -W cpplib:libmccdemo2 -T link:lib mccdemo2.m
命令执行完成后将在工作目录产生使用MATLAB编译生成库文件所需的相关文件。或者使用Deployment Tool工具创建C++ Shared Library工程,添加文件mccdemo2.m.
(3)建立VC对话框工程。
创建一个基于MFC对话框的工程,工程名称为MCCDemo2。在MFCying应用程序向导中选择“应用程序类型”选项卡,选择基于对话框的应用程序类型。
向工程中添加类,取名CCopiedFigure,这个类继承于CStatic 类,它提供把剪切板中的WMF图形显示在MFC界面中。在类视图中右键单击选择“添加”的子项“添加类”。
打开CopiedFigure.h头文件,在属性窗口添加3个消息:
WM_ERASEBKGND
WM_PAINT
WM_DESTROY
同时在CCopiedFigure类中添加几个成员变量和成员函数,最终CopiedFigure.h文件内容如下:
CopiedFigure.cpp文件内容如下:
将第二步编译后生成的如下文件“libmccdemo2.h”“libmccdemo2.dll”“libmccdemo2.lib”“libmccdemo2.cpp”复制到当前工程目录。在文件“MccDemo2Dlg.h”中包含文件“CopiedFigure.h”,修改后内容如下所示:
// MCCDemo2Dlg.h : 头文件
//
#pragma once
#include "CopiedFigure.h"
// CMCCDemo2Dlg 对话框
class CMCCDemo2Dlg : public CDialogEx
{
// 构造
public:
CMCCDemo2Dlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_MCCDEMO2_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtondraw();
afx_msg void OnBnClickedButtonclear();
CCopiedFigure m_figure;
afx_msg void OnDestroy();
};
在文件“MccDemo2Dlg.cpp”中包含文件“libmccdemo2.h”,修改对话框初始化函数如下所示:
BOOL CMCCDemo2Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
bool res = false;
res = mclInitializeApplication(NULL, 0);
if (!res)
{
MessageBox("初始化Application错误!");
}
res = libmccdemo2Initialize();
if (!res)
{
MessageBox("初始化Lib错误!");
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
为对话框添加WM_DESDROY消息,方法与前面类似,内容如下:
void CMCCDemo2Dlg::OnDestroy()
{
CDialogEx::OnDestroy();
// TODO: 在此处添加消息处理程序代码
bool res;
res = mclTerminateApplication();
if (!res)
{
MessageBox("结束程序错误!");
}
libmccdemo2Terminate();
}
为绘图按钮添加消息响应函数。
void CMCCDemo2Dlg::OnBnClickedButtondraw()
{
// TODO: 在此添加控件通知处理程序代码
double figsize[] = { 0.0, 0.0 };
CRect client_rect;
GetClientRect(&client_rect);
figsize[0] = client_rect.Width;
figsize[1] = client_rect.Height;
mwArray mwFigSize(2,1, mxDOUBLE_CLASS, mxREAL);
mwFigSize.SetData(figsize, 2);
mccdemo2(mwFigSize);
m_figure.PasteFigure();
}
为清空按钮添加消息响应函数。
void CMCCDemo2Dlg::OnBnClickedButtonclear()
{
// TODO: 在此添加控件通知处理程序代码
m_figure.ClearFigure();
}
为工程添加库文件libmccdem2.lib和mclmcrrt.lib,
使用快捷键“Ctrl+ F5”编译运行该工程,程序第次启动时会在工程目录下生成“libmccdemo2_mcr”文件夹,里面包含了运行MATLAB库文件所需的相关文件。单击“绘图”按钮,则执行MATLAB编译生成的动态库文件中的函数,同时在MFC对话框上绘制图。单击“清空”按钮则清除绘制图形。