正文

通过mex文件VC和Matlab 的混合编程-myplot2006-10-08 15:43:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/19128.html

分享到:

/* $Revision: 1.3 $ */// Automatically generated by MATLAB Project Wizard version 1.0//// This is the gateway routine for a MATLAB Math/Graphics Library-based// C MATLAB MEX File./*本文的实例的开发和运行环境为 V i s u a l++6.0 和 Matlab 6.5,为了方便阅读,将yplot.c 文件的主要程序代码源代码整理如下link:kernel32.lib user32.lib gdi32.lib winspool.lib libmx.lib libmex.lib libmatlb.lib libmat.lib >>myplot(1:1000,randn(1,1000))*/#include "mex.h"#include "windows.h"LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM,LPARAM);BOOL DrawData(              HWND hWnd,    //窗口句柄              HDC hDC,          //窗口DC的句柄              double * datax,   //绘制图形的:轴数据              double * datay,   //绘制图形的Y轴数据              double minx,      //x轴数据的最小值              double maxi,      //x轴数据的最大值              double miny,      //y轴数据的最小值              double maxy,      //y轴数据的最大值              int ndatanum      //数据点数              );//图形绘制需要的全局变量double*datax=NULL;double*datay=NULL;int datanum=0;int m_isFreeData=0;double maxx=0;double maxy=0;double minx=999999;double miny=999999;//要求输入为x和Y两个数值实阵列void mexFunction(int nlhs, mxArray  *plhs[], int nrhs, const mxArray *prhs[]){//  WNDCLASS wndclass;//  char lpszClassName[]="窗口";    WNDCLASS wc;    MSG msg;    HWND   hWnd ;    HINSTANCE hInstance = NULL;    int i = 0;    // 根据输入参数的个数作不同处理    switch (nrhs)    {    case 2:    {            datax = mxGetPr(prhs[0]);            datay = mxGetPr(prhs[1]);            datanum =                mxGetNumberOfElements(prhs[0]) < mxGetNumberOfElements(prhs[1])?                mxGetNumberOfElements(prhs[0]) : mxGetNumberOfElements(prhs[1]);            maxx = -999999;            maxy = -999999;            minx = 999999;            miny = 999999;            // 寻找 datay 的最大值和最小值            for(i=0;i<datanum;i++)    {                if(datay[i]>maxy) maxy = datay[i];                if(datax[i]>maxx) maxx = datax[i];                if(datay[i]<miny) miny = datay[i];                if(datax[i]<minx) minx = datax[i];    }            break;    }    default:// 外部输入数据错误,绘制坐标        {            mexPrintf(" 输入参数错误,本函数需要两个参数(x,y)!\n");            return;        }    }    //初始化窗口的属性    wc.lpszClassName="GenericAppClass";//  wc.lpszClassName="窗口";    wc.lpfnWndProc=MainWndProc;/// 回调函数    wc.style=CS_OWNDC|CS_VREDRAW|CS_HREDRAW;////  wc.style=0;    wc.hInstance=hInstance;        wc.hIcon=LoadIcon( NULL, IDI_APPLICATION);    wc.hCursor=LoadCursor( NULL, IDC_ARROW);    wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);    wc.lpszMenuName="GenericAppMenu";    wc.cbClsExtra=0;    wc.cbWndExtra=0;    RegisterClass(&wc);//注册窗口类    //创建窗口    hWnd=CreateWindow(        "GenericAppClass", //      "窗口",        "绘制曲线",        WS_OVERLAPPEDWINDOW,        100,//窗口创建时的位置        100,        CW_USEDEFAULT,        CW_USEDEFAULT,        NULL,        NULL,        hInstance,        NULL    );        //显示窗口    ShowWindow( hWnd ,SW_SHOW );    UpdateWindow(hWnd);    while(GetMessage(&msg, NULL,0,0 ))    {        TranslateMessage( &msg );        DispatchMessage( &msg );    }//  return msg.wParam;//}// 处理 Windows 窗口消息的系统回调函数LRESULT CALLBACK MainWndProc(                        HWND   hWnd ,                        UINT   msg ,                         WPARAM wParam,                        LPARAM lParam){    PAINTSTRUCT ps;    HDC hDC;    switch( msg )    {    case WM_PAINT:         hDC = BeginPaint( hWnd, &ps);        DrawData(hWnd,hDC,datax,datay,                minx,maxx,miny,maxy,datanum);        EndPaint( hWnd, &ps );        break;/*    case WM_COMMAND:        switch( wParam )    {            break;    }        break;*/        case WM_DESTROY:            PostQuitMessage(0);            break;        default:            return( DefWindowProc(hWnd, msg, wParam, lParam ));    }    return 0;}// 绘制二维曲线BOOL DrawData(HWND hWnd,HDC hDC,               double *datax, double *datay,                double minx, double maxx,               double miny, double maxy,                int ndatanum){        POINT org;    SIZE size;    RECT winRect;    double dx,dy;    int i;    HPEN hOld=NULL;    HPEN linePen;    //  printf("开始DrawData()");    //设置DC的映射方式      SetMapMode(        hDC,        MM_ANISOTROPIC    );    GetClientRect(hWnd,&winRect);    SetWindowOrgEx(hDC,0,0,&org);    SetWindowExtEx( hDC,1000,-1000,&size);        SetViewportOrgEx(hDC,0,abs(winRect.top-winRect.bottom),&org);    SetViewportExtEx(hDC,abs(winRect.left-winRect.right),abs(winRect.top-winRect.bottom),&size);        //设置DC的背景方式    SetBkMode(hDC,TRANSPARENT);    //创建绘制曲线的画笔    linePen=CreatePen(PS_SOLID,2,RGB(0,0,200));    hOld=SelectObject(hDC,linePen);    //绘制边框    Rectangle(hDC,10,10,1000-10,1000-10);    if(datanum ==0) return FALSE;    //绘制曲线        dx =900.0/(maxx-minx);    dy=900.0/(maxy-miny);    SetROP2(hDC,R2_COPYPEN);    MoveToEx(hDC,10+datax[0]*dx,10+datay[0]*dy,NULL);    for(i=1;i<datanum;i++)    {        LineTo (hDC,10+ (datax[i]-minx)*dx,10+(datay[i]-miny)*dy);    }    //恢复DC画笔的默认设置    SelectObject(hDC,hOld);    return TRUE;}

阅读(522) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册