/* $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;}

评论