Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3433013
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类:

2010-06-09 22:10:51

SimWe仿真论坛---(论坛实行邀请码注册)'s Archiver

shunfly 发表于 2007-5-19 17:01

写了个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]]

shunfly 发表于 2007-5-19 17:21

现在有几个问题
    一个是,我将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]]

taohe 发表于 2007-5-19 17:57

我不是很清楚这种实现方法,不过看起来不错。

关于问题一,试试看给你的控件加上Notify属性,希望这样的话可以把Windows Messages传递给它的Parent,也就是你的View对象

关于问题二,你是像让你的实现更OO?有没有考虑国Functor,也就是实现了operator()的类?

纯属个人拙见

shunfly 发表于 2007-5-19 18:06

[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]]

taohe 发表于 2007-5-19 18:29

用“functor"为关键词搜索,应该有很多相关的讨论。如果你用boost的话,那里应该也有这样的东西(把c的callback用OO的形式实现)

lxdawn 发表于 2007-5-19 21:42

呵呵,N久前也曾经尝试过写这样一个类,可后来一直未果
好好研究下:D

shunfly 发表于 2007-5-20 08:08

第一个问题好像不好直接解决
我试了个基类为CFormView的MFC EXE
在上面放置一STATIC,再以STATIC为父窗口放置FIGURE
消息还是被FIGURE抢劫了
也许因为FIGURE是个窗体而不是单单的一个控件,所以消息还是会被它通吃

taohe 发表于 2007-5-20 09:05

试试看用spy++看消息处理,能不能有点线索。

SCIE兄对这个好像有研究,不知道他是怎么处理这个问题的。

[[i] 本帖最后由 taohe 于 2007-5-20 09:09 编辑 [/i]]

SCIE 发表于 2007-5-20 09:31

第一个问题可以采取子类化的方式,将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]]

shunfly 发表于 2007-5-20 10:15

第一个我先Google下
第二个,我现在试试
PS:我这个和你那个Matlab图形库是一样的初衷:lol

我懂你的意思了
我一开始一直想将CALLBACK放到类里面
因为作为你说的全局函数后,我只能调用类静态成员函数
现在知道解决方案了

[[i] 本帖最后由 shunfly 于 2007-5-20 11:19 编辑 [/i]]

shunfly 发表于 2007-5-21 10:33

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]]

SCIE 发表于 2007-5-21 14:59

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]]

shunfly 发表于 2007-5-21 15:39

的确
由于用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]]

shunfly 发表于 2007-5-21 16:17

查找搞定了
找到鼠标消息了
感谢SCIE:lol
下面开始滤掉被它抢劫的消息
待会贴报告上来

shunfly 发表于 2007-5-21 17:29

完全搞定
具体见附件
这样MATLAB FIGURE完全成了一个纯粹的绘图机器了:lol
不会在抢劫消息了
世界清静了
同时,根据截获的MOUSE_WHEEL消息
待会想个GUI中响应鼠标滚轮的东西出来

SCIE 发表于 2007-5-21 18:49

恭喜,恭喜,第一个下载,抢先试用:lol

效果不错,如果把OnInitialUpdate函数中设置子窗口以及去掉标题栏和边框的功能也封装到类里面,就更加方便了。

[[i] 本帖最后由 SCIE 于 2007-5-21 19:58 编辑 [/i]]

shunfly 发表于 2007-5-22 11:19

起了怪了
想实现如下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]
结果还是如此。画的始终是上次鼠标按下的点?
起了怪了,吃饭先

SCIE 发表于 2007-5-22 11:28

注意,你在新的窗口处理函数中屏蔽了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]]

shunfly 发表于 2007-5-22 11:37

如果真有一个默认点的话
那么,我回去试试[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]]

SCIE 发表于 2007-5-22 13:09

刚才说错了,在鼠标按下和弹起时都更新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]

shunfly 发表于 2007-5-22 14:18

我试验过了
模拟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
而其实点的坐标值还是对的

shunfly 发表于 2007-12-4 20:40

基于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]]

shunfly 发表于 2008-5-8 18:36

这门古老的没有技术含量的手工技术活
答辩完后,准备推出俺以前写的绘图动态库
有这方面需求的可以说说建议意见要求

ylfnwpu 发表于 2008-5-8 23:46

牛人啊,学习

jsjustin 发表于 2009-10-21 15:14

楼主好强啊。混编matcom引擎,dll也试过了。自己都没有想到可以写一个类。

shunfly 发表于 2009-10-21 15:53

重看此贴,和TAOHE,SCIE的讨论真是过瘾来劲。

iryou123 发表于 2010-5-20 14:03

谢谢了,总感觉在vc中调用matlab不方便,感谢楼主的贡献

shunfly 发表于 2010-5-20 15:01

眼界放短了,会拘泥于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]

页: [1]


Powered by Discuz! Archiver 7.0.0  © 2001-2009

阅读(4023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~