正文

通过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;
}





阅读(354) | 评论(0)


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

评论

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