欢迎访问 Lu程序设计

Lu窗口库LuWin

目 录

1 什么是LuWin
2 ChartWnd | 使用数据可视化库CChart。请参考：在Lu脚本中使用CChart绘图系列教程， 或者访问：CChart官方网站。
win::ChartWnd | 显示窗口并进行初始化。
win::cwAttach | 设置图像类型，并粘到窗口。
win::cwAddCurve | 添加曲线。
win::cwUpdateCurve(nDataIndex, pX, pY, nLen, nPlotIndex) | 更新曲线数据。nDataIndex是曲线的序号，pX和pY是一维实数数组，nLen是数据个数，nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。运行错误：1：参数个数不符合要求；2：参数不符合要求。
win::cwUpdateCurveByID(nDataID, pX, pY, nLen, nPlotIndex) | 根据ID号更新曲线数据。nDataID是曲线的ID，pX和pY是一维实数数组，nLen是数据个数，nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。运行错误：1：参数个数不符合要求；2：参数不符合要求。
win::cwSetLangurage(k) | 设置对话框、右键菜单使用的语言。k=0为英文，k=1为中文。默认使用中文。返回逻辑值，true表示成功。
win::cwSetConfineRect(left,top,right,botton) | 设置限制区域。left,top,right,botton为客户区坐标。返回逻辑值，true表示成功。
win::cwGetConfinedRect(&left,&top,&right,&botton) | 获取限制区域，必须使用取地址运算符&。left,top,right,botton为客户区坐标。返回逻辑值，true表示成功。
win::cwIsEmpty() | 测试内部是否无数据。返回逻辑值，true表示有数据。
win::cwAddPoint2D(x, y, nCurve, nPlot) win::cwAddPoint2D(strTime,y,nCurve,nPlot) | 添加2维曲线的一个数据点。strTime是字符串格式的时间（字符串应为"20130528235528"，即年月日时分秒，共14位数字，否则出错）。nCurve表示曲线的序号，nCurve如果等于当前曲线的条数，则新增一条曲线，如果小于0或者大于当前曲线条数，则添加失败；nPlot是分裂视图、分层视图、共享X轴视图的子图序号。nCurve和nPlot可以缺省。返回曲线序号。
win::cwAddPoint3D(x, y, z, nCurve) | 添加3维曲线的一个数据点。nCurve表示曲线的序号，nCurve如果等于当前曲线的条数，则新增一条曲线，如果小于0或者大于当前曲线条数，则添加失败；nCurve可以缺省。返回曲线序号。
win::cwClearData | 清除曲线数据。
win::cwSetReservedDataLength(nLen, nPlotIndex) | 为曲线预留内存空间，主要目的是加快速度。如果根据实际情况预留了内存，则会一次性成功分配内存。nLen为曲线数据数目，nPlotIndex是曲线的序号。返回逻辑值，true表示成功。
win::cwGetIndex(idData, nPlot) | 从曲线的idData（曲线的唯一标识）获得曲线的序号nIndex（序号是连续的），nPlot是分裂视图、分层视图、共享X轴视图的子图序号；若缺省nPlot，默认0子图。 运行错误：1：参数个数不符合要求；2：参数不符合要求。
win::cwGetDataID(nIndex, nPlot) | 从曲线的序号nIndex（序号是连续的）获得曲线的idData（曲线的唯一标识），nPlot是分裂视图、分层视图、共享X轴视图的子图序号；若缺省nPlot，默认0子图。 运行错误：1：参数个数不符合要求；2：参数不符合要求。
win::cwAddPie(value, title) | 添加饼图的一个值。value为实数，字符串title用于设置饼的标题，可缺省。运行错误：1：参数个数不符合要求；2：参数不符合要求。
win::cwAddStems(pData, nLen, title) | 添加柱图的一个序列。pData是一维实数数组，nLen是数据个数，字符串title用于设置 柱的标题，可缺省。 运行错误：1：参数个数不符合要求；2：参数不符合要求。
win::cwSetFieldFcn(@f) | 设置场函数f，用于等高线图、云图、三维曲面图。f为二元函数句柄，必须返回一个实数。运行错误：1：找不到场函数；2：场函数不是二元函数。
win::cwGetType() | 获取图像类型，返回其编码（整数）。
win::cwSetType(nType) | 设置图像类型。返回逻辑值，true表示成功。
win::cwAddLayer() | 增加一个图层，用于分层视图、共享X轴视图。返回一个整数，表示图层号。
win::cwResizePlots | 设置子图数量或图层数量。
win::cwSetPlotRange(X1, X2, Y1, Y2) | 设置X坐标轴和Y坐标轴的范围，常用于typeContourLine（等高线图）。返回逻辑值，true表示成功。
win::cwGetPlotRange(&X1, &X2, &Y1, &Y2, nPlotIndex) | 获取X坐标轴和Y坐标轴的范围。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号，缺省值为0。返回逻辑值，true表示成功。
win::cwSetXRange(low, high, nPlot) | 设置X坐标轴范围，nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetYRange(low, high, nPlot) | 设置Y坐标轴范围，nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetExactXRange(bExact, nPlot) | 设置X坐标轴范围与数据范围相同，不向两端扩展。bExact为逻辑值；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetExactYRange(bExact, nPlot) | 设置Y坐标轴范围与数据范围相同，不向两端扩展。bExact为逻辑值；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetEqualXYAxis(bEqual) | 设置坐标轴等长，只对typeXY有效。bExact为逻辑值。返回逻辑值，true表示成功。
win::cwSetEqualXYRange(bEqual) | 设置坐标轴等范围，只对typeXY有效。bExact为逻辑值。返回逻辑值，true表示成功。
win::cwSetEqualXYScale(bEqual) | 设置坐标轴等比例尺，只对typeXY有效。bExact为逻辑值。返回逻辑值，true表示成功。
win::cwSetTitle(title, nPlot) | 设置图像标题。title为标题字符串；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetShowParentTitle(bSet) | 分层视图显示主标题。bSet为逻辑值。返回逻辑值，true表示成功。
win::cwSetDataTitle(title, nData, nPlot) | 设置数据标题。title为标题字符串；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetDataColor(color, nData, nPlot) | 设置数据颜色。color为数据颜色；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetDataLineStyle(nStyle, nData, nPlot) | 设置数据样式。nStyle为数据样式；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetDataLineSize(nSize, nData, nPlot) | 设置数据大小。nSize为数据大小；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetPlotType(nType, nData, nPlot) | 设置曲线的绘制方式。nType为曲线样式；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetMarkerShow(bShow, nData, nPlot) | 设置曲线数据点标记是否显示。bShow为逻辑值；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetMarkerFill(bFill, nData, nPlot) | 设置曲线数据点标记是否填充。bFill为逻辑值；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetMarkerType(nType, nData, nPlot) | 设置曲线数据点标记的形状。nType为标记的形状；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetMarkerSize(nSize, nData, nPlot) | 设置曲线数据点的大小。nSize为标记的形状；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetMarkerFreq(nFreq, nData, nPlot) | 设置曲线数据点标记频率，0表示不标记，正n表示每隔n个点标记一次，负n表示一共标记n个点。nFreq为标记频率；nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetScatter(nData, nPlot) | 设置曲线散点显示模式。nData为曲线的Index；nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetUseLegend(bUse, nPlot) | 设置是否使用图例。nPlot是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetContourLineNum(num) | 设置等高线图等高线的数量。返回逻辑值，true表示成功。
win::cwSetContourPrecision(n) | 设置等高线图等高线绘制的精度，n越大，精度越高，一般5就可以了。返回逻辑值，true表示成功。
win::cwSetZoomMode(zoom) | 设置图像整体缩放模式。zoom为逻辑值。返回逻辑值，true表示成功。
win::cwSetZoomFactorX(fact) | 设置图像整体缩放时X方向的缩放系数。fact为实数。返回逻辑值，true表示成功。
win::cwSetZoomFactorY(fact) | 设置图像整体缩放时Y方向的缩放系数。fact为实数。返回逻辑值，true表示成功。
win::cwSetZoomFactor(fact) | 设置图像整体缩放时两个方向的缩放系数。fact为实数。返回逻辑值，true表示成功。
win::cwSetZoomCenterMode(center) | 设置图像整体缩放时的缩放中心。fact为整数，0表示左上，1表示左下，2表示右上，3表示右下，4表示中心。返回逻辑值，true表示成功。
win::cwAddAxis(location, nPlotIndex) | 增加坐标轴。location表示轴的位置：0 左轴；1 下轴；2 右轴；3 上轴；4 中轴竖直偏左；5 中轴竖直偏右；6 中轴水平偏下；7 中轴水平偏上；8 三维X轴；9 三维Y轴；10三维Z轴。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号，可以缺省。返回逻辑值，true表示成功。
win::cwSetAxisTitle(title, location, nPlotIndex) | 设置坐标轴标题。title为标题字符串；location和nPlotIndex参考函数cwAddAxis中的说明。返回逻辑值，true表示成功。
win::cwSetAxisToTime(bTime, location, nPlotIndex) | 设置时间坐标轴。bTime为逻辑值；location和nPlotIndex参考函数cwAddAxis中的说明。返回逻辑值，true表示成功。
win::cwSetAxisLabelShow(bShow, location, nPlotIndex) | 设置坐标轴是否显示刻度值。bShow为逻辑值；location和nPlotIndex参考函数cwAddAxis中的说明。返回逻辑值，true表示成功。
win::cwSetPieTitle(title, which) | 设置饼图单个饼的标题。title为标题字符串；which为饼图序号。返回逻辑值，true表示成功。
win::cwSetPieColor(color, which) | 设置饼图单个饼的颜色。color为颜色值；which为饼图序号。返回逻辑值，true表示成功。
win::cwSetStemLabel(label, which) | 设置柱图单根柱子的标签。label为标签字符串；which为柱子序号。返回逻辑值，true表示成功。
win::cwSetStemTitle(title, nDataIndex) | 设置柱图单个序列的标题。title为标题字符串；nDataIndex是数据序号。返回逻辑值，true表示成功。
win::cwSetGridBindLayer(nPlotIndex) | 设置背景网格与哪一个子图绑定，用于共享X轴视图。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号。返回逻辑值，true表示成功。
win::cwSetGridLine | 设置网格线的绘制。
win::cwSetBkgndColor(color, nPlotIndex) | 设置背景颜色color。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号 ，缺省值为0。返回逻辑值，true表示成功。
win::cwSetLRAxis() | 在分层视图和分裂视图中，设置第一层显示左坐标轴，第二层显示右坐标轴。
win::cwSetTBAxis() | 在分层视图中，设置第一层显示下坐标轴，第二层显示上坐标轴。
win::cwSetVKFor | 设置虚拟键函数，使用户通过虚拟键控制图形显示，返回值无意义。
win::cwSetMouseFor | 设置鼠标函数，使用户通过鼠标图形显示，返回值无意义。
win::cwSetExeMsg() | 用户通过cwSetExe设定函数后，通过cwSetExeMsg发送执行消息，返回值无意义。 该函数可在任意线程中执行。
win::cwSetExe(@f) | 设置可通过cwSetExeMsg发送消息执行的函数f，返回逻辑值。运行错误：1：非法的函数句柄。
win::cwSetTimer(@f, Ellapse, bRun) | 设置通过内置定时器执行的函数f，返回逻辑值。Ellapse为计时间隔（毫秒）。若bRun=true，则立即启动计时器；否则在窗口手动启动计时器。Ellapse和bRun均可缺省，缺省值Ellapse=500，bRun=false。运行错误：1：参数个数不符合要求；2：参数不符合要求；3：非法的函数句柄。
以下是用Lu脚本定义的实用绘图函数，可在OpenLu环境中可直接使用，函数定义位置： module\ChartWnd实用函数.txt
luShareX(data) | 绘制共享X轴视图。data是一个矩阵或者二维数组。
luShareX2(data1, data2) | 绘制共享X轴视图。data1和data2是两个矩阵或者二维数组。 用于比较data1和data2的差别。
luPlot(data) | 绘制一元函数共享X轴图形。data是一个lu对象。
3 LuWin函数
win::Plot | 动态绘制一元函数及数组图形。
win::PlotExe | 向Plot发送执行函数命令并刷新图形。
win::FunTimer | 使用计时器定时执行函数。
win::SetPara | 设置可通过参数修改窗口修改的参数。
win::GetWin(k) | 获得窗口句柄。k=hPlot时获得Plot窗口的句柄；k=hChartWnd时获得ChartWnd窗口的句柄。
win::RGB(r,g,b) | 定义绘图颜色。r,g,b分别表示红色值、绿色值和蓝色值。r,g,b取值范围均为0～255。
win::MessageBox | 消息框函数。
win::GetFileName(str) | 选择一个文件名。字符串str显示到打开文件对话框的标题栏中，可缺省此参数。返回一个动态字符串，包含了所选择的文件名，若用户放弃选择，返回一个空串。 运行错误：1：参数个数不符合要求；2：非法的字符串；3：内存错误。

1 什么是LuWin [返回页首]

LuWin32.dll是一个Lu扩展动态库，主要包含一些窗口函数，特别是绘制2D或3D图形的函数。多线程动态绘制图形是LuWin的基本特点。

LuWin 主要由 网友笨笨开发的数据可视化库CChart提供支持，保留所有权利。 笨笨兄的E-mail：baita00@aliyun.com，QQ、微信：1541583，官方网站：www.cchart.net。

在LuWin中的函数是通过二级函数命名空间“win”输出的，所有函数均具有类似“win::Plot(...)”的格式。使用!!!using("win");可简化LuWin中的函数访问。

LuWin32.dll需要MLu32.dll的支持。

2 ChartWnd [返回页首]

LuWin中的ChartWnd直接对数据可视化库CChart的包装类 CChartWnd中的函数进行了封装。ChartWnd在独立的线程中运行，用户在ChartWnd窗口进行键盘或鼠标操作时，会转换为相应的Lu函数调用，以获取数据及属性进行绘图。 除函数cwSetExeMsg外，其他以cw开头的函数，只有在ChartWnd窗口线程中调用时，才会起作用。ChartWnd既可静态显示图形，也可动态显示图形。ChartWnd的动态运行机制见下图：

[返回页首] win::ChartWnd(@init)：显示窗口并进行初始化。

init：初始化函数句柄 ，仅在窗口创建时调用一次。一般在初始化函数中添加图形数据、属性、用户操作图形界面时需要调用的函数等。

返回值：窗口句柄。

运行错误：1：非法的函数句柄。

[例子]：

> !!!using("win","math"); //使用命名空间win和math
> ~~~init()= cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5}; //初始化函数，只编译，不执行
> ChartWnd[@init]; //显示窗口

[返回页首] win::cwAttach(type, left,top,right,botton)：设置图像类型，并粘到窗口。

type：图像类型。可取的值为：typeXY（折线图、普通XY图）、typePie（饼图）、typeStem（柱图）、typeOscillo（模拟示波器图）、typeContourLine（等高线图）、typeContourMap（ 等高云图）、typeSplit（分裂视图）、typeShareX（共享X轴视图）、typeLayered（分层视图）、type3DLine（三维折线图、3D曲线图）、type3DSurface（三维曲面图、3D曲面图）。
left,top,right,botton：客户区坐标。

返回值：逻辑值true或false。

运行错误：1：参数个数不符合要求；2：非法的绘图类型；3： 非法的客户区坐标。

用法1：cwAttach() //默认typeXY类型
用法2：cwAttach(type)
用法3：cwAttach(type, left,top,right,botton)

[例子1]：饼图

> !!!using("win"); //使用命名空间win
> init(x)= cwAttach[typePie], cwAddPie[28.0], cwAddPie[38.0, "这个最大"], cwAddPie[32.0]; //初始化函数，参数x使得函数init只编译，不执行
> ChartWnd[@init]; //显示窗口

[例子2]：等高线

> !!!using("win");
> f(x,y)= 1.0/[(x-1.0)*(x-1.0)+y*y+1.0];
> init(x)= cwAttach[typeContourLine], cwSetFieldFcn[@f];
> ChartWnd[@init];

[例子3]：云图

> !!!using("win");
> f(x,y)= 1.0/((x-1.0)*(x-1.0)+y*y+1.0) + 1.0/((x+1.0)*(x+1.0)+y*y+1.0);
> init(x)= cwAttach[typeContourMap], cwSetFieldFcn[@f], cw SetPlotRange[-2.0,2.0, -2.0,2.0];
> ChartWnd[@init];

[例子4]：柱图

> !!!using("win","math");
> init(x)= cwAttach[typeStem], cwAddStems{ra1[1,2,3,4,5],5}, cwAddStems{ra1[3,2,5,4,1],5,"二月"};
> ChartWnd[@init];

[例子5]：3D曲线

> !!!using("win","math");
> init(x)= cwAttach(type3DLine), x=linspace[0.0,20.0,100], cwAddCurve{x, cos(x), sin(x), 100};
> ChartWnd[@init];

[例子6]：3D曲面

> !!!using("win");
> f(x,y)=(x^2-2*x)*exp(-(x^2)-y^2-x*y);
> init(x)= cwAttach(type3DSurface), cwSetFieldFcn[@f], cwSetPlotRange[-3.0,3.0,-5.0,5.0];
> ChartWnd[@init];

[例子7]：定时器例子：自动演示一段折线动画

> !!!using("win","math");
> f(x:static,k)= cwClearData(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,(k++)%10,2,6], 5};
> init(x)= cwSetTimer[@f, 500, true];
> ChartWnd[@init];

[例子8]：参数修改窗口控制的例子

> !!!using("win","math");
> initk(::k)= k=0.0; //初始化k
> f(x::k)= cwClearData(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,k,2,6], 5};
> 修改k(m,x::k)= which{m==0:k, m==1:[k=k+x], m==2:[k=k-x], m==3:[k=x], cwSetExeMsg()}; //修改模块变量k并刷新ChartWnd窗口的函数
> init(x)= cwSetExe[@f];
> ChartWnd[@init];
> SetPara{GetWin(hChartWnd), //获得ChartWnd函数的窗口句柄。可以缺省该参数获得另一效果。
> @修改k,1.0 //使参数k可动态修改
> };

[返回页首] win::cwAddCurve(... ...)：添加曲线

用法1：cwAddCurve() //默认0号子图，添加空曲线
用法2：cwAddCurve(nPlot) //添加nPlot号子图空曲线
用法3：cwAddCurve(pX, pY, nLen) //默认0号子图，添加曲线：pX和pY是一维实数数组，nLen是数据个数
用法4：cwAddCurve(pX, pY, nLen, nPlot) //添加nPlot号子图曲线：pX和pY是一维实数数组，nLen是数据个数
用法5：cwAddCurve(pStrTime, pY, nLen) //默认0号子图，添加曲线：X坐标 pStrTime 是时间字符串（格式见下面的说明）；Y坐标pY是一维实数数组，nLen是数据个数
用法6：cwAddCurve(pStrTime, pY, nLen, nPlot) //添加nPlot号子图曲线：X坐标 pStrTime 是时间字符串（格式见下面的说明）；Y坐标pY是一维实数数组，nLen是数据个数
用法7：cwAddCurve(pX, pY, pZ, nLen) //添加三维曲线数据：pX、pY和pZ是一维实数数组，nLen是数据个数

pStrTime的格式："20130528235528 20130528235529 ... ..."，20130528235528 即年月日时分秒 ，共14位数字加一个任意字符，否则出错。

返回值：曲线的ID号，注意不是序号，返回-1表示添加曲线失败。

运行错误：1：参数个数不符合要求；2：参数不符合要求 ；3：内存错误。

[返回页首] win::cwClearData(nData, nPlot)：清除曲线数据。

nData：曲线的序号nIndex。
nPlot：分裂视图、分层视图、共享X轴视图的子图序号。

用法1：cwClearData() //清除全部曲线数据
用法2：cwClearData(nPlot) //清除nPlot子图所有曲线数据
用法3：cwClearData(nData, nPlot) //清除nPlot子图的第nData条曲线数据

返回值：无意义。

运行错误：1：参数个数不符合要求；2：参数不符合要求。

[返回页首] win::cwResizePlots(...)：设置子图数量或图层数量。

用法1：cwResizePlots(nLayers) //设置图层数量，用于分层视图、共享X轴视图，nLayers为大于0的整数。
用法2：cwResizePlots(mode, nRows, nCols) //设置子图数量，用于分裂视图，其中mode（0～5）表示分裂模式；nRows（大于0）表示行数，nCols（大于0）表示列数 ，这两个参数只有mode为1时起作用。

分裂视图的分裂模式：0表示不分裂；1表示行列分裂；2表示左一右二的三分裂；3表示左二右一的三分裂；4表示上一下二的三分裂；5表示上二下一的三分裂。

返回值：逻辑值，true表示成功。

[例子1]：共享X轴视图

> !!!using("win","math");
> init(x)=
> cwAttach[typeShareX], cwResizePlots(2),
> cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5, 0},
> cwAddCurve{ra1[1,2,3,4,5], ra1[100,300,600,200,500], 5, 1};
> ChartWnd[@init];

[例子2]：分层视图

> !!!using("win","math");
> init(x)=
> cwAttach[typeLayered], cwResizePlots(2),
> cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5, 0},
> cwAddCurve{ra1[12,22,33,44,55], ra1[100,300,600,200,500], 5, 1};
> ChartWnd[@init];

[例子3]：分裂视图

> !!!using("win","math");
> init(x)=
> cwAttach[typeSplit], cwResizePlots(2,2,2),
> cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5, 0},
> cwAddCurve{ra1[-1,-2,3,4,5], ra1[100,300,600,200,500], 5, 1},
> cwAddCurve{ra1[1,2,3,33,55], ra1[10,30,60,20,50], 5, 2};
> ChartWnd[@init];

[返回页首] win::cwSetGridLine(... ...)：设置网格线的绘制

用法1：cwSetGridLine(MajorH, MajorV, MinorH, MinorV, nPlotIndex)

说明：MajorH, MajorV, MinorH, MinorV为逻辑值；nPlotIndex为整数，是分裂视图、分层视图、共享X轴视图的子图序号 。所有参数均可缺省，缺省值为：MajorH=true, MajorV=true, MinorH=false, MinorV=false。返回逻辑值，true表示成功。

用法2：cwSetGridLine(MajorXY, MinorXY, MajorYZ, MinorYZ, MajorZX, MinorZX)

说明：用于设置三维曲线的网格。所有参数均为逻辑值。返回逻辑值，true表示成功。

[返回页首] win::cwSetVKFor(iVK, @f)：设置虚拟键函数，使用户通过虚拟键控制图形显示。

iVK：虚拟键代码，可取的值为0～165。
f：用户按键时执行的函数。

返回值：逻辑值。

运行错误：1：参数不符合要求。

以下虚拟键名称已经定义，可以在程序中直接使用。

虚拟键 | 十六进制值 | 十进制值 | 相应键盘或鼠标键 |  | 虚拟键 | 十六进制值 | 十进制值 | 相应键盘或鼠标键
VK_LBUTTON | 1 | 1 | 鼠标左键 |  | VK_NUMPAD7 | 67 | 103 | 小数字键盘7键
VK_RBUTTON | 2 | 2 | 鼠标右键 |  | VK_NUMPAD8 | 68 | 104 | 小数字键盘8键
VK_CANCEL | 3 | 3 | Ctrl-Break 键 |  | VK_NUMPAD9 | 69 | 105 | 小数字键盘9键
VK_MBUTTON | 4 | 4 | 鼠标中键 |  | VK_MULTIPLY | 6A | 106 | 乘号键
VK_BACK | 8 | 8 | Backspace 键 |  | VK_ADD | 6B | 107 | 加号键
VK_TAB | 9 | 9 | Tab 键 |  | VK_SEPARATOR | 6C | 108 | 分割键
VK_CLEAR | 0C | 12 | Clear 键 |  | VK_SUBSTRACT | 6D | 109 | 减号键
VK_RETURN | 0D | 13 | Enter 键 |  | VK_DECIMAL | 6E | 110 | 小数点键
VK_SHIFT | 10 | 16 | Shift 键 |  | VK_DIVIDE | 6F | 111 | 除号键
VK_CONTROL | 11 | 17 | Ctrl 键 |  | VK_F1 | 70 | 12 | F1 键
VK_MENU | 12 | 18 | Alt 键 |  | VK_F2 | 71 | 113 | F2 键
VK_PAUSE | 13 | 19 | Pause 键 |  | VK_F3 | 72 | 114 | F3 键
VK_CAPITAL | 14 | 20 | Caps Lock 键 |  | VK_F4 | 73 | 115 | F4 键
VK_ESCAPE | 1B | 27 | Esc 键 |  | VK_F5 | 74 | 116 | F5 键
VK_SPACE | 20 | 32 | Space 键 |  | VK_F6 | 75 | 117 | F6 键
VK_PRIOR | 21 | 33 | PageUp 键 |  | VK_F7 | 76 | 118 | F7 键
VK_NEXT | 22 | 34 | PageDown 键 |  | VK_F8 | 77 | 119 | F8 键
VK_END | 23 | 35 | End 键 |  | VK_F9 | 78 | 120 | F9 键
VK_HOME | 24 | 36 | Home 键 |  | VK_F10 | 79 | 121 | F10 键
VK_LEFT | 25 | 37 | ←键 |  | VK_F11 | 7A | 122 | F11 键
VK_UP | 26 | 38 | ↑键 |  | VK_F12 | 7B | 123 | F12 键
VK_RIGHT | 27 | 39 | →键 |  | VK_F13 | 7C | 124 | F13 键
VK_DOWN | 28 | 40 | ↓键 |  | VK_F14 | 7D | 125 | F14 键
VK_SELECT | 29 | 41 | Select 键 |  | VK_F15 | 7E | 126 | F15 键
VK_PRINT | 2A | 42 | Print 键 |  | VK_F16 | 7F | 127 | F16 键
VK_EXECUTE | 2B | 43 | Execute 键 |  | VK_F17 | 80 | 128 | F17 键
VK_SNAPSHOT | 2C | 44 | Print Screen 键 |  | VK_F18 | 81 | 129 | F18 键
VK_INSERT | 2D | 45 | Ins 键 |  | VK_F19 | 82 | 130 | F19 键
VK_DELETE | 2E | 46 | Del 键 |  | VK_F20 | 83 | 131 | F20 键
VK_HELP | 2F | 47 | Help 键 |  | VK_F21 | 84 | 132 | F21 键
VK_LWIN | 5B | 91 | 左windows键 |  | VK_F22 | 85 | 133 | F22 键
VK_RWIN | 5C | 92 | 右windows键 |  | VK_F23 | 86 | 134 | F23 键
VK_APPS | 5D | 93 | 应用程序键 |  | VK_F24 | 87 | 135 | F24 键
VK_SLEEP | 5F | 95 | 休眠键 |  | VK_NUMLOCK | 90 | 144 | Num Lock键
VK_NUMPAD0 | 60 | 96 | 小数字键盘0键 |  | VK_SCROLL | 91 | 145 | Scroll Lock键
VK_NUMPAD1 | 61 | 97 | 小数字键盘1键 |  | VK_LSHIFT | A0 | 160 | 左Shift键
VK_NUMPAD2 | 62 | 98 | 小数字键盘2键 |  | VK_RSHIFT | A1 | 161 | 右 Shift键
VK_NUMPAD3 | 63 | 99 | 小数字键盘3键 |  | VK_LCONTROL | A2 | 162 | 左 Ctrl键
VK_NUMPAD4 | 64 | 100 | 小数字键盘4键 |  | VK_RCONTROL | A3 | 163 | 右Ctrl键
VK_NUMPAD5 | 65 | 101 | 小数字键盘5键 |  | VK_LMENU | A4 | 164 | 左 Alt键
VK_NUMPAD6 | 66 | 102 | 小数字键盘6键 |  | VK_RMENU | A5 | 165 | 右Alt键

[例子]：用PageUp键、PageDown键和→键控制图形。连续按→键可得到动画图形。

> !!!using("win","math");
> f(x,y)= 1.0/[(x-1.0)*(x-1.0)+y*y+1.0];
> a(x)= cwAttach[typeContourLine], cwSetFieldFcn[@f];
> b(x)= cwAttach[typePie], cwAddPie[28.0], cwAddPie[32.0];
> c(x:static,k)= cwAttach(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,(k++)%10,2,6], 5};
> init(x)= cwSetVKFor[VK_PRIOR, @a], cwSetVKFor[VK_NEXT, @b], cwSetVKFor[VK_RIGHT, @c];
> ChartWnd[@init];

[返回页首] win::cwSetMouseFor(iMouse, @f)：设置鼠标函数，使用户通过鼠标图形显示，返回值无意义。

iMouse：鼠标消息代码，可取的值为0x0200～0x0209（WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK）。
f：鼠标消息发生时执行的函数。

返回值：逻辑值。

运行错误：1：参数不符合要求。

[例子]：双击鼠标左键、单击鼠标左键和单击鼠标右键控制图形。连续单击鼠标左键可得到动画图形。

> !!!using("win","math");
> f(x,y)= 1.0/[(x-1.0)*(x-1.0)+y*y+1.0];
> a(x)= cwAttach[typeContourLine], cwSetFieldFcn[@f];
> b(x)= cwAttach[typePie], cwAddPie[28.0], cwAddPie[32.0];
> c(x:static,k)= cwAttach(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,(k++)%10,2,6], 5};
> init(x)= cwSetMouseFor[WM_LBUTTONDBLCLK, @a], cwSetMouseFor[WM_RBUTTONDOWN, @b], cwSetMouseFor[WM_LBUTTONDOWN, @c];
> ChartWnd[@init];

[返回页首] luShareX(data)：绘制共享X轴视图。data是一个矩阵或者二维数组。

[例子1]：

> !!!using("win","math");
> init(x)=
> matrix[ //用一个矩阵形式的字符串对矩阵进行初始化
> "
> 1 5 100
> 2 3 300
> 3 1 600
> 4 2 200
> 5 6 500
> "
> ].luShareX();
> ChartWnd[@init];

[例子2]：

> !!!using("win","math");
> init(x)=
> x = matrix[
> "
> 1 2 3 4 5
> 5 3 1 2 6
> 100 300 600 200 500
> "
> ],
> luShareX(x'); //求矩阵x的转置
> ChartWnd[@init];

[例子3]：

> !!!using("win","IMSL","math");
> f(t,r,f,dr,df)={dr=2*r-2*r*f, df=-f+r*f}; //函数定义
> init(x) = ode{@f,linspace[0.0,10.0,100],ra1[1,3]}.luShareX(); //ode方程的解是一个二维数组
> ChartWnd[@init];

[返回页首] luShareX2(data1, data2)：绘制共享X轴视图。data1和data2是两个矩阵或者二维数组。用于比较data1和data2的差别。

说明：data1和data2列数可以不相同，但相同的列有相同的坐标轴；data1绘制点图，data2绘制折线图。

[例子]：

> !!!using("win","math");
> init(x,y)=
> x=matrix[
> "
> 1 5 100
> 2 3 300
> 3 1 600
> 4 2 200
> 5 6 500
> "
> ],
> y=matrix[
> "
> 1 4.9 110
> 2 3.0 300
> 3 1.2 595
> 4 2.0 210
> 5 5.9 510
> "
> ],
> luShareX2(x, y);
> ChartWnd[@init];

[返回页首] luPlot(data)：绘制一元函数共享X轴图形。data是一个lu对象。

说明：luPlot接受一个lu对象，绘制一元函数共享X轴图形，lu对象格式：lu{xMin, xMax, 绘图点数_缺省为1000, @f1, "f1曲线标记（可缺省）", @f2, "f2曲线标记（可缺省）", ... ...}

[例子]：

> !!!using("win");
> f(x) = sin[x].*x-x; //必须是矢量化代码，简单地：乘号用 .* ；除号用 ./ ；乘方用 .^ ；加号和减号不变，仍然用 + 和 - 。
> g(x) = cos[x];
> init(x) = luPlot{lu[-9.0,9.0, @f,"函数f", @g,"函数g"]};
> ChartWnd[@init];

3 LuWin函数 [返回页首]

[返回页首] win::Plot(Item1,Attribute1,Value1,Attribute2,Value2,...,Item2,Attribute3,Value3,Attribute4,Value4,... ...)：动态绘制一元函数及数组图形

Plot的参数有三种类型：

（1）以I开头的参数为项目，例如Ix表示要设置X轴的绘图范围，Iufun表示要绘制一元函数图形等等；

（2）以A开头的参数为项目的属性，例如Acolor表示要设置曲线的颜色；

（3）以V开头的参数为属性的值，例如Vred表示曲线是红色的。

所有参数的说明见下表：

I 类型的参数及用法 | 说 明
win::Iauto | 程序退出时自动关闭Plot窗口。这是缺省设置。
win::Ihand | 程序退出时手动关闭Plot窗口。
win::Ixdynamic : bDynamic | 若bDynamic=true，则X轴绘图区间是动态的。若缺省该参数，相当于bDynamic=false。仅用于iarray、oarray类型的图形。
win::Iydynamic : bDynamic | 若bDynamic=true，则Y轴绘图区间是动态的，将自动绘制自变量范围内的函数完整图形。若缺省该参数，相当于bDynamic=true。
win::Ix : Xmin,Xmax | 设置X轴绘图区间。
win::Iy : Ymin,Ymax | 设置Y轴绘图区间。仅仅进行设置，Y轴绘图区间是否固定，取决于Iydynamic参数。
win::Igarray : hFor,... ...（其他属性设置） | 绘制普通数组图形。hFor为三元函数句柄，该函数具有f(x,y,n)的形式：x和y为等长的luData一维数组，n为需要绘制的数组元素个数 （n不能超过数组长度）。
win::Iiarray : hFor,... ...（其他属性设置） | 内部计时器控制绘制数组图形。hFor为四元函数句柄，该函数具有f(x,y,n,t)的形式：x和y为等长的luData一维数组，n为需要绘制的数组元素个数（n不能超过数组长度），t返回当前时间。若f(x,y,n,t)返回false，不再定时执行该函数。
win::Ioarray : hFor,... ...（其他属性设置） | 外部（计时器）控制绘制数组图形。hFor为四元函数句柄，该函数具有f(x,y,n,t)的形式：x和y为等长的luData一维数组，n为需要绘制的数组元素个数 （n不能超过数组长度），t返回当前时间。
win::Iufun : hFor,... ...（其他属性设置） | 可缺省win::Iufun。绘制一元函数图形。hFor为一元函数句柄，该函数具有f(x)的形式。
win::Iifun : hFor,... ...（其他属性设置） | 可缺省win::Iifun。绘制一元隐函数图形。hFor为二元函数句柄，该函数具有f(x,y)的形式。可能需要调整绘图点数Adots为合适的数值，才能得到理想的图形。
win::Ipfun : hFor,... ...（其他属性设置） | 可缺省win::Ipfun。绘制含参变量的函数图形。hFor为三元函数句柄，该函数具有f(u,x,y)的形式，u为参变量，x返回x(u)的值，y返回y(u)的值 。
win::Itimer : bRun,Ellapse | 设置内部计时器。若bRun=true，则启动绘图窗口后立即启动计时器；否则在绘图窗口手动启动计时器。Ellapse为计时间隔（毫秒）。 由于计时器可通过计时器窗口设置，故很少直接使用该函数。
win::Ititle : "标题" | 设置图形标题。
win::Ilable : "X轴说明","Y轴说明" | 设置X轴及Y轴说明。
win::Igrid : bDraw | 是否绘制网格。bDraw为true时绘制。缺省是不绘制。
win::Iaxisratio : xRatio,yRatio | 坐标轴比率。显示坐标轴数字时所乘的系数。缺省是1。
win::Iaxisshape : Vaxisshape | 坐标轴形状。有Vaxisnormal、Vaxissquare、Vaxisequal三种形状。默认是Vaxisnormal。
A 类型的参数及用法 | 说 明
win::Aline | 绘制曲线图。这是缺省设置（Iifun除外）。
win::Adot | 绘制散点图。Iifun类型图形的缺省设置。
win::Adots,n | 设置绘图点数。仅用于Iufun、Iifun和Ipfun类型的图形。若缺省该参数，对Iufun和Ipfun图形，默认绘制500个点；对Iifun图形，默认绘制100个点。
win::Adotsmax,n | 设置绘图点数最大数。仅用于Iifun类型的图形。若缺省该参数，默认最多绘制10000个点。
win::Arange,min,max | 设置Iifun和Ipfun类型图形的参数变化范围。Iifun类型函数具有f(x,y)的形式，该参数用于设置y的估计变化范围，允许min==max，若缺省该参数，min和max取Y轴绘图区间（即Iy的设定值）；Ipfun类型函数具有f(u,x,y)的形式，该参数用于设置u的变化范围。
win::Aprecision,eps | 设置Iifun类型隐函数的求解精度。若缺省该参数，默认求解精度为1e-6。
win::Acolor,Vcolor | 设置曲线（点）的颜色。曲线和点颜色的默认值由系统自动确定。
win::Amarker,marker | 设置曲线数据点标记是否显示。marker为true时显示。缺省是不显示。
win::Ashape,Vshape | 设置曲线（点）的形状。曲线和点形状的默认值由系统自动确定。
win::Alegend,"曲线（点）标记" | 设置曲线（点）的标记。将显示为图例。
V 类型的参数及用法 | 说 明
win::Vsolid | 曲线形状为实线。
win::Vdash | 曲线形状为虚线。
win::Vdashdot | 曲线形状为点线。
win::Vdashdotdot | 曲线形状为点划线。
win::Vnull | 曲线形状为无。
win::Vinsideframe | 曲线形状为实线（边框线）。
win::Vnone | 点形状为空。
win::Vcircle | 点形状为空心圆。
win::Vsquare | 点形状为矩形。
win::Vdiamond | 点形状为菱形。
win::Vupt | 点形状为上三角。
win::Vdpt | 点形状为下三角。
win::Vlpt | 点形状为左三角。
win::Vrpt | 点形状为右三角。
win::Vfork | 点形状为×。
win::Vcross | 点形状为＋。
win::Vbar | 点形状为实心圆点。
win::Vsdot | 点形状为实心圆点。
win::Vred | 红色。
win::Vyellow | 黄色。
win::Vgreen | 绿色。
win::Vblue | 蓝色。
win::Vgray | 灰色。
win::Vblack | 黑色。
win::Vaxisnormal | 坐标轴正常显示方式。
win::Vaxissquare | X轴和Y轴的单位长度相同。
win::Vaxisequal | 坐标轴图框呈正方形。

返回值：0。

运行错误：1：不可识别的参数类型标识；2：参数不匹配；3：参数不符合要求；4：非法的函数句柄；5：内存错误；6：非法是字符串参数；7：函数的参数个数太多或者太少。

说明：

目前Plot函数支持三种函数图形：

（1）Igarray类型的数组，Iufun、Iifun和Ipfun类型的函数。此类图形仅在通过菜单命令更改设置时更新数据（例如改变了X轴的最小值），内部计时器及外部控制对此毫无影响。

（2）Iiarray类型的数组。此类图形的更新仅受内部计时器的控制。

（3）Ioarray类型的数组。此类图形的更新仅受外部（计时器）的控制。

Plot函数的运行机制如下图所示：

Plot函数的基础用法：

（1）Plot函数的简单用法

> f(x)=sin[10*x]; //一元函数
> g(x)=x*sin[10*x]; //一元函数
> win::Plot[@f, @g]; //绘制函数f和g的图形

这种用法非常简单， 部分属性已经自动设置了，例如曲线的颜色；其余属性可通过菜单进行设置，例如：X轴的范围（X轴范围更改后，还要执行右键菜单“按新设定的坐标轴重绘”）。

以下例子是通过脚本设置图形属性的。

（2）Ix选项

> !!!using("win"); //使用命名空间win
> f(x)=sin[10*x]; //一元函数
> g(x)=x*sin[10*x]; //一元函数
> Plot[Ix : -5.,5., @f, @g]; //绘制函数f和g的图形，Ix指出X轴绘图范围

（3）隐函数图形

> !!!using("win");
> f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2; //二元函数确定了一个隐函数
> Plot[Ix : -8.,8., Igrid : true, //Igrid指出是否绘制网格
> @f, Arange,-8.,8., Adots,200]; //Arange指出Y的可能的变化范围，通常不能省略该参数；Adot指出绘图点数，绘图点数越多越准确

友情提示：隐函数绘制时，调整Arange的范围大小有助于获得更准确的图形。

（5）绘制含参变量的函数

> !!!using("win");
> f(u,x,y)= x=u*sin[u],y=u*cos[u]^2; //三元函数确定了一个含参变量的函数，第一个参数u是参变量，x和y的返回值确定了一个点
> Plot[Ix : -9.,9., @f, Arange,-9.,9.]; //Arange指出参变量u的变化范围

Plot函数的例子：

[例子1] 一元函数图形绘制

> !!!using("win"); //使用命名空间win
> f(x)=sin[x]; //函数定义
> g(x)=x*sin[x]; //函数定义
> Plot{Ix : -5.,5., //设置X轴绘图范围
> Iufun : @f, //绘制函数f的图形
> Iufun : @g,Adot,Adots,100 //绘制函数g的图形，将绘制散点图，绘制100个点
> };

本例近乎等效的矢量化代码如下：

> !!!using("win","math");
> (::x,y1,y2,max)= max=100, x=linspace(-5.,5.,max), y1=sin(x), y2=x.*sin(x);
> f(xx,yy,n::x,y1,max)= xx=x,yy=y1,n=max;
> g(xx,yy,n::x,y2,max)= xx=x,yy=y2,n=max;
> Plot{Ix : -5., 5.,
> Igarray : @f, //绘制普通数组图形，绘制为曲线图
> Igarray : @g,Adot //绘制普通数组图形，绘制为散点图
> };

本例近乎等效的隐函数图形绘制代码为：

> !!!using("win");
> f(x,y)=sin[x]-y; //隐函数定义
> g(x,y)=x*sin[x]-y; //隐函数定义
> Plot{Ix : -5.,5.,
> Iifun : @f,
> Iifun : @g
> };

图形如下所示：

在Plot窗口，可以双击或右单击打开“曲线设置”窗口，设置曲线属性。

[例子2] 一元函数图形绘制并显示标题、坐标轴、图例和标记

> !!!using("win");
> f(x)=sin[x];
> g(x)=x*sin[x];
> Plot{Ix : -5.,5.,
> Iufun : @f, Alegend,"sin[x]", Amarker,true, Acolor,Vblue, //绘制函数f的图形并显示图例和标记
> Iufun : @g, Alegend,"x*sin[x]",Amarker,true, Acolor,RGB(0,255,0), //绘制函数g的图形并显示图例和标记
> Ititle : "Plot演示程序", //显示标题
> Ilable : "t /℃","V /m^3" //显示坐标轴说明
> };

图形如下所示：

在Plot窗口，可以双击或右单击打开“曲线设置”窗口，设置曲线属性。

[例子3] 一元函数及含参变量函数图形绘制

> !!!using("win");
> f(x)=sin[x];
> g(u,x,y)= x=u*sin[u],y=u*cos[u]^2;
> Plot{Ix : -9.,9.,
> Iufun : @f,Acolor,Vred, //绘制函数f的图形，颜色是红色的
> Ipfun : @g,Arange,-9.,9. //绘制函数g的图形，参变量的变化范围是 -9～9
> };

图形如下所示：

[例子4] 通过参数控制函数图形

> !!!using("win");
> init(::A,B,C)= A=2.,B=1.,C=0.; //初始化模块变量
> A(m,x::A)= which{m==0:A, m==1:[A=A+x], m==2:[A=A-x], m==3:[A=x], PlotExe(0)}; //修改模块变量A并刷新Plot窗口的函数
> B(m,x::B)= which{m==0:B, m==1:[B=B+x], m==2:[B=B-x], m==3:[B=x], PlotExe(0)}; //修改模块变量B并刷新Plot窗口的函数
> C(m,x::C)= which{m==0:C, m==1:[C=C+x], m==2:[C=C-x], m==3:[C=x], PlotExe(0)}; //修改模块变量C并刷新Plot窗口的函数
> f(x::A,B,C)=A*sin[B*x+C];
> g(u,x,y::A,B)= x=u*sin[u+A],y=u*cos[u*B]^2;
> Plot{Ix : -5.,5.,
> Iufun : @f,Acolor,Vred,
> Ipfun : @g,Arange,-3.,3.
> },
> SetPara{GetWin(hPlot), //获得Plot函数的窗口句柄。可以缺省该参数获得另一效果。
> @A,0.5, //使参数A可动态修改
> @B,0.5, //使参数B可动态修改
> @C,0.5 //使参数C可动态修改
> };

图形如下所示（其动态效果需通过参数控制演示）：

[例子5] 普通数组图形绘制

> !!!using("win","math");
> init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
> B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
> f(x,y,n::A,B)= x=A,y=B,n=15;
> ff(x,y,n)= f(&x,&y,&n);
> g(x,y,n::A,B)= x=B,y=A,n=15;
> Plot{Ix : -12.,12.,
> Igarray : @f, //绘制数组为曲线
> Igarray : @ff,Adot, //绘制数组为散点图
> Igarray : @g,Ashape,Vdash,Acolor,Vred //绘制数组为曲线
> };

图形如下所示：

[例子6] 内部计时器控制的数组图形绘制

> !!!using("win","math");
> init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
> B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
> f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20,if[i>50,return(false)],true; //函数f只运行50次
> ff(x,y,n,t)= f(&x,&y,&n,&t);
> g(x,y,n,t:static,i:A,B)= x=B,y=A,n=++i%20,true;
> Plot{Ix : -12.,12.,
> Iiarray : @f,
> Iiarray : @ff,Adot,
> Iiarray : @g,Ashape,Vdash,Acolor,Vred
> };

图形如下所示（其动态效果需通过内部计时器控制演示 ：在Plot窗口，打开“计时器设置”窗口，点击开始按钮，观察动态图形）：

[例子7] 外部（计时器）控制的数组图形绘制，横轴固定不变

> !!!using("win","math");
> init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
> B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
> f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20;
> ff(x,y,n,t)= f(&x,&y,&n,&t);
> g(x,y,n,t:static,i:A,B)= x=B,y=A,n=++i%20;
> Plot{Ix : -12.,12.,
> Iiarray : @f,
> Iiarray : @ff,Adot,
> Iiarray : @g,Ashape,Vdash,Acolor,Vred
> };
> ~~~:::a(:static,k) = PlotExe[],if[++k>=50,return(false)],true; //全局函数a只运行50次
> ~~~:::b() = PlotExe[],true;
> FunTimer[]; //启动定时器

图形如下所示（其动态效果需通过外部计时器控制演示）：

在 FunTimer 窗口，在计时器1的全局函数名输入窗口输入“a”，点击开始按钮，观察动态图形，直至图形自动停止更新；在计时器2的全局函数名输入窗口输入“b”，点击开始按钮，观察动态图形，该动态图形不会自动停止。

[例子8] 外部（计时器）控制的数组图形绘制，横轴动态更新

> !!!using("win","math");
> init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
> B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
> f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20;
> ff(x,y,n,t)= f(&x,&y,&n,&t);
> Plot{Ixdynamic : true, //X轴是动态的
> Ioarray : @f,
> Ioarray : @ff,Adot,Acolor,Vred
> };
> ~~~:::a(:static,k) = PlotExe[],if[++k>=50,return(false)],true;
> ~~~:::b() = PlotExe[],true;
> FunTimer[];

图形如下所示（其动态效果需通过外部计时器控制演示）：

在 FunTimer 窗口，在计时器1的全局函数名输入窗口输入“a”，点击开始按钮，观察动态图形，直至图形自动停止更新；在计时器2的全局函数名输入窗口输入“b”，点击开始按钮，观察动态图形，该动态图形不会自动停止。

[例子9] 内部计时器控制演示动态图形

> !!!using("win","math");
> init(::A,B,max)= max=500, A=new[real_s, max], B=new[real_s, max];
> f(x,y,n,t:i,u,d,static,k:A,B,max)=
> {
> x=A,y=B,n=++k%(max+1), t=0.,
> u=-9.,d=18./max,i=0,(i<n).while{
> x[i]=u*sin[u], y[i]=u*cos[u]^2,
> u=u+d, i++
> },
> true
> };
> Plot{Ixdynamic : true,
> Iiarray : @f,Adot,Ashape,Vdiamond,Acolor,Vred,
> Itimer : true, 100
> };

图形如下所示（直接运行程序即可动态演示）：

[例子10] 内部计时器控制演示动态图形：旋轮线动画

> !!!using("win","math");
> init(::A,B,C,D,max)= max=200, A=new[real_s, max+1], B=new[real_s, max+1], C=new[real_s, max], D=new[real_s, max];
> f(x,y,n,t:i,u,d,static,k:A,B,max)=
> {
> x=A,y=B,n=[++k%(max+1)], t=0.,
> u=0.,d=15./(max-1),i=0,(i<n).while{
> x[i]=[u-sin(u)], y[i]=[1-cos(u)],
> u=u+d, i++
> },
> x[i]=u, y[i]=1., n++,
> true
> };
> g(x,y,n,t:i,u,d,static,k,v:C,D,max)=
> {
> x=C, y=D, n=max, t=0.,
> if[1==[++k%(max+1)], v=0.],
> u=0.,d=2*3.1416/(max-1),i=0,(i<n).while{
> x[i]=v+cos(u), y[i]=1+sin(u),
> u=u+d, i++
> },
> v=v+15./(max-1), true
> };
> Plot{Ix : 0.,15., Iy : 0.,2., Iydynamic : false, Iaxisshape : Vaxisequal,
> Iiarray : @f,Acolor,Vred,
> Iiarray : @g,Acolor,Vblue,
> Itimer : true, 100
> };

图形如下所示：

[例子11] 隐函数图形（x取1.5～10，y取2附近）：f(x,y)=ln(3.5*x^y)+x-y^x-(sin(y-x))^2+0.6-(x+y)^(0.1*x)/x;

> !!!using("win");
> f(x,y)=ln(3.5*x^y)+x-y^x-(sin(y-x))^2+0.6-(x+y)^(0.1*x)/x;
> Plot{Ix : 1.5,8.,
> Iifun : @f,Arange,2.,2. //y取2附近
> };

图形如下所示：

[例子12] 隐函数图形（x取-8～8，y取-8～8附近）：f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;

> !!!using("win");
> f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
> Plot{Ix : -8.,8., Iaxisshape : Vaxissquare,
> Iifun : @f,Arange,-8.,8. //y取-8～8
> };

图形如下所示：

[例子13] 隐函数图形（x取-5～5，y取-5～5附近）：f(x,y)=cos(x*y);

> !!!using("win");
> f(x,y)=cos(x*y);
> Plot{Ix : -5.,5., Iy : -5.,5., Iydynamic : false, Igrid : true,
> Iifun : @f, Acolor,Vblue, Adots,300
> };

图形如下所示：

[返回页首] win::PlotExe()或win::PlotExe(x)：向Plot发送执行函数命令并刷新图形

说明：win::PlotExe()用于执行用win::Ioarray注册到Plot的绘图函数 ；win::PlotExe(x)用于执行用注册到Plot的非计时器绘图函数（包括win::Igarray、win::Iufun、win::Iifun、win::Ipfun），x为任意值。可在任意线程中通过该函数控制Plot中图形的刷新。

[例子]

[返回页首] win::FunTimer()：使用计时器定时执行函数

返回值：0。

说明：最多设置三个同时运行的计时器，每个计时器定时执行一个对应的全局函数。若全局函数返回false，将销毁对应的计时器，该全局函数也不再执行。

计时器窗口启动后，可以打开计时器设置窗口，如下所示：

[例子1] 先编译运行以下代码，然后按上面的计时器窗口进行设置，点击按钮，观察运行情况。

> ~~~:::a() = o{"执行函数a！\r\n"},true; //必须定义为全局函数，前面的~~~表示只编译，不运行
> ~~~:::b() = o{"执行函数b！\r\n"},true;
> ~~~:::c() = o{"执行函数c！\r\n"},true;
> win::FunTimer[]; //启动定时器窗口

[例子2] 由全局函数自身控制运行次数。

> ~~~:::a(:static,k) = o{"执行函数a！\r\n"},if[++k>=5,return(false)],true; //全局函数a只运行5次
> ~~~:::b() = o{"执行函数b！\r\n"},true;
> ~~~:::c() = o{"执行函数c！\r\n"},true;
> win::FunTimer[];

[返回页首] win::SetPara(hWin,hFor1,dx1,hFor2,dx2,... ...)：设置可通过参数修改窗口修改的参数

hWin：父窗口句柄。可以缺省该参数。
hFor1,dx1,hFor2,dx2,... ...：hFor为二元函数句柄，该函数由SetPara的参数修改窗口调用，具有以下格式：

> 修改 x(mode,dx::x)= //mode为工作模式，整数；dx为增量，实数；x是一个模块变量
> {
> if{mode==0, return(x)}, //mode为0，返回x当前值；SetPara初始化时，会使用mode=0获得x的初值
> if{mode==1, x=x+dx, return(x)}, //mode为1，使x增加dx并返回x当前值
> if{mode==2, x=x-dx, return(x)}, //mode为2，使x减少dx并返回x当前值
> if{mode==3, x=dx, return(x)}, //mode为3，重置x为初值，返回值被忽略
> if{mode<0, ... 用户定义操作 ...] //mode小于0时，执行用户定义的操作
> };

该函数的作用是通过增量dx修改模块变量x，并执行某些操作。SetPara初始化时，将先调用 修改 x(0,任意值) 以获得模块变量x的初值xx。SetPara的参数修改窗口有三个按钮：增加、减少、重置。

【增加】：先执行修改 x(1,dx)，然后执行修改 x(-1,任意值)。
【减少】：先执行修改 x(2,dx)，然后执行修改 x(-1,任意值)。
【重置】：先执行修改 x(3,xx)，然后执行修改 x(-1,任意值)。

运行错误：1：参数不匹配，函数参数个数太多或者太少；2：找不到全局函数，或者该函数不是二元函数，或者函数返回值不是一个实数；3：内存错误；4：参数不符合要求。

[例子]

[返回页首] win::MessageBox("消息框中显示的字符串","作为标题的字符串")：消息框函数

格式1：MessageBox["消息框中显示的字符串","作为标题的字符串"]
格式2：MessageBox["消息框中显示的字符串","作为标题的字符串",nType]
格式3：MessageBox[HWND,"消息框中显示的字符串","作为标题的字符串",nType]

说明：HWND标识将被创建的消息框的拥有窗口，如果此参数为null，则消息框没有拥有窗口；nType指定一个决定对话框的内容和行为的位标志集，此参数可以为下列标志组中标志的组合（尚未定义这些参数）：MB_OK、MB_OKCANCEL、MB_YESNO、MB_YESNOCANCEL，其他标志请参考WINDOWS API手册中该函数的说明。

返回值：如果没有足够的内存来创建消息框，则返回值为0。如果函数调用成功，则返回值为下列对话框返回的菜单项目值中的一个（尚未定义这些参数）：
IDABORT：Abort按钮被选中。
IDCANCEL：Cancel按钮被选中。
IDIGNORE：Ignore按钮被选中。
IDNO：NO按钮被选中。
IDOK：OK按钮被选中。
IDRETRY：RETRY按钮被选中。
IDYES：YES按钮被选中。
标志和返回值的具体值请参考WINDOWS API手册，也可以自行验证。

运行错误：1：参数个数不符合要求；2：参数不符合要求。

版权所有© Lu程序设计 2002-2014，保留所有权利
E-mail: forcal@sina.com QQ：630715621
最近更新: 2014年02月13日