写了个MATLAB VC绘图类
[color=blue]头文件[/color][code]/*-------------------------------------------------| Created : 2007/05/19
| Created : 19:5:2007 16:58
| File base: MatGraph
| File ext : hpp
| Author : Shunfly
| MATLAB : 6.5.1
| By : Visual Assist
|-------------------------------------------------*/
#include "matlab.hpp"
#include "libmwsglm.hpp"
#include "libmatlbm.hpp"
#include "libmmfile.hpp"
#include "mex.h"
#pragma comment(lib,"libmwsglm.lib")
#pragma comment(lib,"libmatlb.lib")
#pragma comment(lib,"libmmfile.lib")
#pragma comment(lib,"libmatlbmx.lib")
#pragma comment(lib,"sgl.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmatpm.lib")
#pragma comment(lib,"libmwservices.lib")
class CMatGraph
{
/*
系统函数-------构造析构
*/
public:
CMatGraph();
virtual ~CMatGraph();
/*
成员函数
*/
public:
mwArray hFigure ; // 保存Figure 句柄
static int NCount ; // 静态成员变量。保存对象个数
mexFunctionTableEntry my_local_function;
_mexLocalFunctionTable my_local_function_table;
};[/code][color=blue]类实现[/color]
[code]#include "stdafx.h"
#include "MatGraph.hpp"
#include
int CMatGraph::NCount = 0;
void M_CallBack(mwArray hObject,
mwArray eventdata,
mwArray handles);
void mlx_CallBack(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[])
{
MW_BEGIN_MLX();
mwArray mprhs[3];
int i;
for (i = 0; i < 3 && i < nrhs; ++i) {
mprhs = mwArray(prhs, 0);
}
for (; i < 3; ++i) {
mprhs.MakeDIN();
}
M_CallBack(mprhs[0], mprhs[1], mprhs[2]);
MW_END_MLX();
}
void M_CallBack(mwArray hObject,
mwArray eventdata,
mwArray handles)
{
// mwLocalFunctionTable save_local_function_table_
// = &my_local_function_table_simwe;
/*
所有的Gui Callback的通用入口
*/
}
CMatGraph::CMatGraph()// 类构造函数
{
// MATLAB C++图形库初始化
NCount++;
if(NCount==1)
// 仅仅需要调用一次 图形库初始化
{
libmmfileInitialize();
libmwsglmInitialize();
int argc;
argc=0;
const char *p = NULL;
mlfHGInitialize(&argc,&p);
}
hFigure=Nfigure(1,mwArray("name") , mwArray("Figure"),
mwArray("numbertitle") , mwArray("off"),
mwArray("color") , mwArray("w"),
mwArray("visible") , mwArray("off"));
mexFunctionTableEntry my_local_function[1]
= { { "CallBack", mlx_CallBack, 3, 0, NULL } };
_mexLocalFunctionTable my_local_function_table
= { 1, my_local_function};
}
CMatGraph::~CMatGraph()
{
// 类析构函数
// MATLAB C++图形库退出
if (tobool(ishandle(CMatGraph::hFigure)))
{
delete_func(mwVarargin(CMatGraph::hFigure));
}
if(NCount==1)
// 仅仅需要调用一次 图形库退出
{
mlfHGWaitForFiguresToDie();
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
}
NCount--;
}[/code]
[[i] 本帖最后由 shunfly 于 2007-5-20 10:47 编辑 [/i]] 现在有几个问题
一个是,我将FIGURE镶嵌到视图VIEW后,由于FIGURE拦路抢劫,VIEW
无法响应鼠标等消息。
而通过FIGURE的一个属性,MATLAB中截获鼠标按键消息并不好,居然还区分两键和三键鼠标。当然,这个应该通过WIN32 API可以完成。
我想把FIGURE的以及我所有需要的MATLAB控件的CALLBACK放在[code]void M_CallBack(mwArray hObject,
mwArray eventdata,
mwArray handles)[/code]里。但是,这个尝试了一个中午,无法嵌入到类中去。主要是[code]mexFunctionTableEntry my_local_function[1]
= { { "CallBack", mlx_CallBack, 3, 0, NULL } };[/code]这里面的mlx_CallBack函数原型是个函数指针。将mlx_CallBack等统统设置为类
成员函数后,无法识别。
现在的问题是:
1。MATLAB FIGURE嵌入VC的视图VIEW后,在FIGURE上是否还可以有办法响应
VIEW的鼠标等消息?
实在是舍不的MFC给俺搭好的消息架子吧。
我这完全是用C/C++库写,灵活一些
所以,能在VC写的就不在MATLAB的这个类中写
2。能否有办法将[code]void M_CallBack(mwArray hObject,
mwArray eventdata,
mwArray handles);
void mlx_CallBack(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) ;
void M_CallBack(mwArray hObject,
mwArray eventdata,
mwArray handles);[/code]这几个函数放到类中去?
这样可以很方便VC MATLAB交互数据。而现在,我仅仅只能通过静态数据成员传递数据。
[[i] 本帖最后由 shunfly 于 2007-5-19 17:27 编辑 [/i]] 我不是很清楚这种实现方法,不过看起来不错。
关于问题一,试试看给你的控件加上Notify属性,希望这样的话可以把Windows Messages传递给它的Parent,也就是你的View对象
关于问题二,你是像让你的实现更OO?有没有考虑国Functor,也就是实现了operator()的类?
纯属个人拙见 [i=s] 本帖最后由 shunfly 于 2009-11-12 20:40 编辑 [/i]
MATLAB的FIGURE也可以如此加Notify属性?
我查查看(:)
我的FIGURE是直接以VIEW视图为父窗口
或者你是说,在VIEW上放置PICTURE类似的控件
设置Notify属性
把FIGURE的父窗口设置为该控件?
这样好处是不必考虑图形库的初始化和退出
而且我还封装了类似[code]CMatGraph::CMatplot2D(double *datax,double *datay,int Ndatax,int Ndatay);[/code]这样的绘图
这样便于不会MATLAB的人直接当接口使用
“也就是实现了operator()的类”
这个如何理解?
[[i] 本帖最后由 shunfly 于 2007-5-19 18:30 编辑 [/i]] 用“functor"为关键词搜索,应该有很多相关的讨论。如果你用boost的话,那里应该也有这样的东西(把c的callback用OO的形式实现) 呵呵,N久前也曾经尝试过写这样一个类,可后来一直未果
好好研究下:D 第一个问题好像不好直接解决
我试了个基类为CFormView的MFC EXE
在上面放置一STATIC,再以STATIC为父窗口放置FIGURE
消息还是被FIGURE抢劫了
也许因为FIGURE是个窗体而不是单单的一个控件,所以消息还是会被它通吃 试试看用spy++看消息处理,能不能有点线索。
SCIE兄对这个好像有研究,不知道他是怎么处理这个问题的。
[[i] 本帖最后由 taohe 于 2007-5-20 09:09 编辑 [/i]] 第一个问题可以采取子类化的方式,将Figure窗口子类化,也就是重新指定Figure窗口的窗口处理函数(用SetWindowLong),在其中截获需要的消息传递给View的消息窗口处理函数进行处理,不需要截获的则仍由Figure窗口处理。
第二个问题是Callback的问题,由于这是给Matlab回调用的,所以它可能不支持functor。
我的实现方式是建立一个中间层,Matlab回调时调用中间层的函数,然后中间层的函数再调用合适的处理函数。中间层函数必须是一个全局函数,而中间层调用的处理函数则是一个类成员函数了。
你定义了M_Callback和mlxCallback,还有一个函数表,用来实现回调函数。但这样做可能有些复杂,有一组宏可以代替你做以上复杂的工作。参看下面这个帖子的关于“函数注册”的讨论。
[url=][/url]
那么由于中间层是个全局的函数,而Figure窗口可能有很多个,也就是CMatGraph会有很多个实例,怎样在中间层函数里区分调用哪个实例的处理函 数呢?我们可以在设置回调函数的时候把当前CMatGraph实例的指针作为一个long型数值用setappdata存储到该对象中。中间层函数最好设 置为没有任何输入参数的那种。
// 回调中间层函数
mwArray CallbackFcn()
{
1. 获取当前的CallbackObject
2. 用guidata 获取handles句柄结构体
3. 用 getappdata 获取存储在CallbackObject中的CMatGraph实例指针
4. 调用CMatGraph中的处理函数,将CallbackObject,EventData,handles作为参数传入
}
// 对函数 CallbackFcn 进行注册
DECLARE_FEVAL_TABLE
FEVAL_ENTRY(CallbackFcn)
END_FEVAL_TABLE
设置回调函数的时候只需指定为字符串形式的“CallbackFcn”就行了。
Vset(hFigure, "WindowButtonDownFcn", "CallbackFcn");
然后再用setappdata存储当前CMatGraph实例指针
我以前写了个包装Matlab图形库的dll,在处理回调函数时用的就是类似的方法。这个库采用一对一封装Matlab库函数的形式,简化函数接口,使用 普通的数据类型作为参数,还可以在VB,Delphi里用。这个库在MATLAB第二次研讨会上提到过,但是当时几乎没有人感兴趣。
[[i] 本帖最后由 SCIE 于 2007-5-20 10:02 编辑 [/i]] 第一个我先Google下
第二个,我现在试试
PS:我这个和你那个Matlab图形库是一样的初衷:lol
哦
我懂你的意思了
我一开始一直想将CALLBACK放到类里面
因为作为你说的全局函数后,我只能调用类静态成员函数
现在知道解决方案了
[[i] 本帖最后由 shunfly 于 2007-5-20 11:19 编辑 [/i]] SCIE
按照你提示的窗口子类化的想法
我Google尝试了一下,还学了下SPY++的用法
发现有这么个问题:
我自定义的CALLBACK消息处理函数无法得到WM_LBUTTONDOWN等常规消息
也就是以下程序的::MessageBox(NULL,"12","左键DOWN",MB_OK);部分无法响应
但在SPY|++中的的确确是看到了消息。
[color=red]难道是因为MATLAB窗口不是标准的WIN32 窗口?
[/color]不过意外之喜就是,我捕捉到了[color=red]WM_MOUSEWHEEL[/color]的鼠标滚轮消息,也就是说
在7.X以前的GUI编译中,改写一下,可以支持鼠标滚轮。这样免去了JAVA响应鼠标
滚轮无法支持7.X以前的编译的困扰。
相关函数如下:[code]//定义CMatGraph类的静态成员函数static WNDPROC OldProc;
HWND hWnd=FindWindow(NULL,"Figure");
if(!hWnd)
{
::MessageBox(NULL,"1","找不到窗口",MB_OK);
return;
}
CMatGraph::OldProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewProc);
LRESULT CALLBACK NewProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if(Msg==WM_LBUTTONDOWN)
{
::MessageBox(NULL,"12","左键DOWN",MB_OK);
return 1;
}
if(Msg==WM_LBUTTONUP)
{
::MessageBox(NULL,"12","左键UP",MB_OK);
return 1;
}
if (Msg==WM_MOUSEWHEEL)
{
::MessageBox(NULL,"12","鼠标滚轮",MB_OK);
return 1;
}
else
{
return CallWindowProc(CMatGraph::OldProc, hWnd, Msg, wParam, lParam);
}
}[/code]
[[i] 本帖最后由 shunfly 于 2007-5-21 11:58 编辑 [/i]] Matlab的Figure窗口有两层:
一个是Figure窗口的外框架,就是你用FindWindow直接查到的窗口,它包括外窗口边框和菜单,主要响应与框架有关的一些消息,典型的如WM_SIZING消息;
在Figure窗口之下有一个子窗口,其类名叫MatlabFigureClass,标题为空。它就是Figure窗口中通常显示图形和控件的地方,包括 工具栏在内。它响应大多数的我们所关心的消息,如鼠标、键盘消息。查找这个窗口需要用FindWindowEx函数,使用类名 MatlabFigureClass查找。
如果我们需要某种特定的消息,就需要子类化特定的窗口-Figure窗口还是其子窗口。注意这两个窗口会有一些共同的消息,如WM_SIZE消息。当然两 个窗口的WM_SIZE消息的参数是不一样的,父窗口的WM_SIZE消息携带的参数是父窗口的大小,而子窗口的消息参数是子窗口的大小。
不过,我想大多数时候只需要关心子窗口的消息就可以了,按照你的想法是把Figure窗口潜入到View中,也就没有边框和菜单了。特别的时候可能需要处 理只有父窗口才有的消息:比如WM_SIZING,父窗口在大小被改变之前发送此消息,可以截获此消息实现一些特殊的效果,比如一个只允许放大,不允许缩 小的窗口。
祝你早日搞定!:victory:
[color=red]关键就是要子类化MatlabFigureClass这个子窗口,因为它处理你想要的鼠标键盘消息![/color]
[[i] 本帖最后由 SCIE 于 2007-5-21 15:51 编辑 [/i]] 的确
由于用SetWindowLong去掉了标题栏等
我用到的是子窗口,类CLASS为MatlabFigureClass,CAPTION为空[code]HWND hWnd=FindWindow(NULL,"Figure");[/code]这个查找的也就是子窗口
不过我出现的问题是在窗口子类化后的[code]LRESULT CALLBACK NewProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)[/code]新的消息处理函数里面
我无法截取到WM_LBUTTONDOWN等消息
MessageBox(NULL,"12","左键DOWN",MB_OK);没有弹出,程序直接跳过
相反,仅仅只能截获WM_MOUSEWHEEL消息
弹出::MessageBox(NULL,"12","鼠标滚轮",MB_OK);
[color=red]哦,我明白你的意思了[/color]
[color=red]我回实验室试试FindWindowEx看看[/color]
[[i] 本帖最后由 shunfly 于 2007-5-21 15:45 编辑 [/i]] 查找搞定了
找到鼠标消息了
感谢SCIE:lol
下面开始滤掉被它抢劫的消息
待会贴报告上来 完全搞定
具体见附件
这样MATLAB FIGURE完全成了一个纯粹的绘图机器了:lol
不会在抢劫消息了
世界清静了
同时,根据截获的MOUSE_WHEEL消息
待会想个GUI中响应鼠标滚轮的东西出来 恭喜,恭喜,第一个下载,抢先试用:lol
效果不错,如果把OnInitialUpdate函数中设置子窗口以及去掉标题栏和边框的功能也封装到类里面,就更加方便了。
[[i] 本帖最后由 SCIE 于 2007-5-21 19:58 编辑 [/i]] 起了怪了
想实现如下GUI
[code]
function VCGui
ezplot(@sin);
set(gcf,'WindowButtonDownFcn',@Action,'DoubleBuffer','on');
function Action(hObject,eventdata,handles)
hold on;
p=mean(get(gca,'currentpoint'));
plot(p(1),p(2),'o','MarkerSize',8,'MarkerFaceColor','r')
[/code]
VC实现如下:
[code]
void VCTESTView::OnLButtonDown(UINT nFlags, CPoint point)
{
CView::OnLButtonDown(nFlags, point);
if(mCMatGraph.DrawType==1)
{
mwArray mPoint = mean(get(gca(),mwArray("currentpoint")));
hold(mwArray("on"));
Vplot(mPoint(1),mPoint(2),"o","MarkerSize",8,"MarkerEdgeColor","g","MarkerFaceColor","r");
drawnow(mwArray::DIN);
}
}
[/code]
居然得到的结果是有延迟?
画的始终是上一个点,而第一个点不知道从何方而来
设置一变量
[code]
static int DrawType =0 ;
[/code]
改窗口子类化程序
[code]
if(Msg==WM_LBUTTONDOWN)
{
if(CMatGraph::DrawType==1)
{
::SendMessage(CMatGraph::ViewHandle,WM_LBUTTONDOWN,wParam,lParam);
}
return 0;
}
[/code]
添加一菜单
[code]
void CCLTEM25DView::OnVCGui()
{
mCMatGraph.DrawType=1;
}
[/code]
改消息处理函数
[code]
void VCTESTView::OnLButtonDown(UINT nFlags, CPoint point)
{
CView::OnLButtonDown(nFlags, point);
if(mCMatGraph.DrawType==1)
{
mwArray mPoint = mean(get(gca(),mwArray("currentpoint")));
hold(mwArray("on"));
Vplot(mPoint(1),mPoint(2),"o","MarkerSize",8,"MarkerEdgeColor","g","MarkerFaceColor","r");
drawnow(mwArray::DIN);
}
}
[/code]
结果还是如此。画的始终是上次鼠标按下的点?
起了怪了,吃饭先 注意,你在新的窗口处理函数中屏蔽了Figure窗口对鼠标按键的处理:[code]LRESULT CALLBACK NewProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if(Msg==WM_LBUTTONDOWN)
{
// Figure窗口未能处理该消息
::PostMessage(CMatGraph::ViewHandle,WM_LBUTTONDOWN,wParam,lParam);
return 0;
}
if(Msg==WM_RBUTTONDOWN)
{
// Figure窗口未能处理该消息
::PostMessage(CMatGraph::ViewHandle,WM_RBUTTONDOWN,wParam,lParam);
return 0;
}
else
{
return CallWindowProc(CMatGraph::OldProc, hWnd, Msg, wParam, lParam);
}
}[/code]这样在 get(gca, 'CurrentPoint') 时无法取得正确的值了,这些消息还应该让Figure窗口继续处理。
至于第一个点,可能是有个默认的吧。
[[i] 本帖最后由 SCIE 于 2007-5-22 13:10 编辑 [/i]] 如果真有一个默认点的话
那么,我回去试试[code]LRESULT CALLBACK NewProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if(mCMatGraph.DrawType==0)
return CallWindowProc(CMatGraph::OldProc, hWnd, Msg, wParam, lParam);
if(Msg==WM_LBUTTONDOWN)
{
::PostMessage(CMatGraph::ViewHandle,WM_LBUTTONDOWN,wParam,lParam);
return 1;
}
else
{
return CallWindowProc(CMatGraph::OldProc, hWnd, Msg, wParam, lParam); }
}[/code][color=red]原来如此[/color]
[color=red]既然如此,干脆,狠心不要CurrentPoint[/color]
[color=red]直接根据point像素和axes的Position以及Xtick,Ytick自己转换坐标[/color]
[color=#ff0000]或者,我可以在[/color]
[color=#ff0000][code]
if(Msg==WM_LBUTTONDOWN)
{
::PostMessage(hWnd,WM_LBUTTONUP,wParam,lParam);
::PostMessage(CMatGraph::ViewHandle,WM_LBUTTONDOWN,wParam,lParam);
return 1;
}
[/code][/color]
[color=#ff0000]再处理一下,模拟鼠标Up,更新CurrentPoint[/color]
[[i] 本帖最后由 shunfly 于 2007-5-22 11:51 编辑 [/i]] 刚才说错了,在鼠标按下和弹起时都更新CurrentPoint,只是刚才LButtonDown被你屏蔽了,我觉得应该先让MATLAB处理鼠标消息,再让View处理比较好,不需要模拟LButtonUp了。
[code]
LRESULT CALLBACK NewProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT result = CallWindowProc(CMatGraph::OldProc, hWnd, Msg, wParam, lParam);
if(Msg==WM_LBUTTONDOWN)
{
::PostMessage(CMatGraph::ViewHandle,WM_LBUTTONDOWN,wParam,lParam);
}
return result;
}
[/code] 我试验过了
模拟UP也是可以的
只是要注意模拟的UP别又被我过滤掉就行
我一开始之所以会出现有几个跳点的问题
是类似于这样的函数
[code]
function VCGui
axes;
set(gcf,'WindowButtonDownFcn',@Action,'DoubleBuffer','on');
function Action(hObject,eventdata,handles)
hold on;
p=mean(get(gca,'currentpoint'));
plot(p(1),p(2),'o','MarkerSize',8,'MarkerFaceColor','r')
[/code]
坐标系刚刚建立,并没有画图
当一个空白的坐标存在时
MATLAB会根据前两个点,确定直线,也就是大概确定了xlim,ylim
而其实点的坐标值还是对的 基于MATLAB6.5,对7.X有启发。希望把什么寻找窗体,嵌入VC的工作扔掉吧!
至于其他功能,参照本帖,酌情加入
单文档MFC EXE
View类h,Include,定义
public:
CMatGraph m_MatAxes ;
View类cpp,OnInitialUpdate()中,创建
m_MatAxes.Create(this,0,0,1,1) ;
View类cpp,OnSize(UINT nType, int cx, int cy)中,
m_MatAxes.OnSize();
[color=DarkRed]类头文件MatGraph.hpp[/color]
[code]#include "matlab.hpp"
#include "libmwsglm.hpp"
#include "libmatlb.hpp"
#include "mwservices.h"
#include "libmatlbm.hpp"
class CMatGraph
{
public:
CMatGraph() ;
virtual ~CMatGraph() ;
private:
mwArray m_hFigure ;
CWnd *m_wParentWnd ;
HWND m_HwndFig ;
bool m_bIniStart ;
double m_dPosition[4] ;
public:
void Create(CWnd *mHPar,
double dPox ,double dPoy,
double dWdith ,double dHeight );
void OnSize() ;
};[/code]
[color=DarkRed]类实现文件MatGraph.cpp[/color]
[code]#include "stdafx.h"
#include "MatGraph.hpp"
CMatGraph::CMatGraph()
{
libmmfileInitialize() ;
libmwsglmInitialize() ;
int argc ;
argc=0 ;
const char *p = NULL ;
mlfHGInitialize(&argc,&p) ;
m_hFigure=Nfigure(1,"name" , "Figure" ,
"numbertitle" , "off" ,
"color" , "w" ,
"visible" , "off" ) ;
m_bIniStart = false ;
}
CMatGraph::~CMatGraph()
{
if (tobool(ishandle(m_hFigure)))
{
delete_func(mwVarargin(m_hFigure));
}
mlfHGWaitForFiguresToDie() ;
mlfHGTerminate() ;
libmmfileTerminate() ;
libmwsglmTerminate() ;
}
void CMatGraph::Create(CWnd *mHPar,
double dPox ,double dPoy,
double dWdith ,double dHeight )
{
HWND hFig = ::FindWindow(NULL,"Figure") ;
long lStyle = ::GetWindowLong(hFig,GWL_STYLE) ;
::SetWindowLong(hFig,GWL_STYLE,
lStyle &(~WS_CAPTION) & (~WS_THICKFRAME));
::SetParent(hFig,mHPar->GetSafeHwnd()) ;
Vset(m_hFigure,"visible" ,"on") ;
Vaxes("parent",m_hFigure);
m_bIniStart = true ;
m_wParentWnd = mHPar ;
m_HwndFig = hFig ;
m_dPosition[0] = dPox ;
m_dPosition[1] = dPoy ;
m_dPosition[2] = dWdith ;
m_dPosition[3] = dHeight ;
OnSize() ;
drawnow(mwArray::DIN) ;
}
void CMatGraph::OnSize()
{
if(m_bIniStart)
{
RECT PlotRec ;
m_wParentWnd->GetWindowRect(&PlotRec) ;
long Width = PlotRec.right - PlotRec.left ;
long Height = PlotRec.bottom - PlotRec.top ;
mwArray Position = ones(1,4) ;
Position(1) = 0 ;
Position(2) = 0 ;
Position(3) = Width*m_dPosition[2] ;
Position(4) = Height*m_dPosition[3] ;
Vset(m_hFigure,"visible" ,"on",
"units" ,"pixels",
"Position" ,Position) ;
::SetWindowPos(m_HwndFig, NULL,
int(Width*m_dPosition[0]),
int(Height*m_dPosition[1]),
int(Width*m_dPosition[2]),
int(Height*m_dPosition[3]),
SWP_NOZORDER | SWP_NOACTIVATE);
}
}[/code]
[[i] 本帖最后由 shunfly 于 2007-12-4 20:43 编辑 [/i]] 这门古老的没有技术含量的手工技术活
答辩完后,准备推出俺以前写的绘图动态库
有这方面需求的可以说说建议意见要求 牛人啊,学习 楼主好强啊。混编matcom引擎,dll也试过了。自己都没有想到可以写一个类。 重看此贴,和TAOHE,SCIE的讨论真是过瘾来劲。 谢谢了,总感觉在vc中调用matlab不方便,感谢楼主的贡献 眼界放短了,会拘泥于VC和MATLAB关系中,你总觉得MATLAB庞大,VC调用MATLAB相当负责
眼界放开点,你会发现,在VC调用MATLAB过程中,MATLAB无非提供了一个内容一个封口而已。与我们平时自己建立VC DLL留个Hpp接口无异。
[quote]谢谢了,总感觉在vc中调用matlab不方便,感谢楼主的贡献
[size=2][color=#999999]iryou123 发表于 2010-5-20 14:03[/color] [url=][img]http://forum.simwe.com/images/common/back.gif[/img][/url][/size][/quote]