matlab图形绘制在MFC界面上

时间:2024-03-13 08:47:12

(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文件内容如下:

matlab图形绘制在MFC界面上

CopiedFigure.cpp文件内容如下:

matlab图形绘制在MFC界面上

matlab图形绘制在MFC界面上

matlab图形绘制在MFC界面上

matlab图形绘制在MFC界面上

matlab图形绘制在MFC界面上

将第二步编译后生成的如下文件“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对话框上绘制图。单击“清空”按钮则清除绘制图形。