// 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;
}
正文
通过mex文件VC和Matlab 的混合编程-myplot2006-10-08 15:43:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/embed/19128.html
阅读(431) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论