/***intellisense() 
!winform._embedObject = 嵌入 COM 控件的容器对象\n!embedObjectForm.
!winform.createEmbed( = 创建嵌入控件,返回控件容器对象,\n容器对象的 _object 成员是创建的 COM 对象,\n容器对象可通过添加成员函数响应 COM 对象事件，\n容器对象的主要作用是充当访问 COM 对象的中间代理对象。\n通常使用 util.metaProperty 为容器对象添加属性元表，\n属性元表可拦截属性、函数调用并调用 _object 对象,\n\ncreateEmbedEx 返回的容器已添加默认代理以直接访问 COM 对象
!winform.createEmbed(.(clsId,embedObj) = 创建嵌入控件,返回控件容器对象,\n容器对象的 _object 成员是创建的 COM 对象,\n容器对象可通过添加成员函数响应 COM 对象事件，\n容器对象的主要作用是充当访问 COM 对象的中间代理对象,\n@clsId 指定控件 CLSID,\n可选在参数 @2 中指定 COM 对象绑定的容器对象\n\n此函数失败会抛出异常
!winform.createEmbed(.(comObject,embedObj) = 嵌入 COM 控件,返回控件容器对象,\n容器对象的 _object 成员是传入的 COM 对象,\n容器对象可通过添加成员函数响应 COM 对象事件，\n容器对象的主要作用是充当访问 COM 对象的中间代理对象,\n@comObject 指定已创建成功的 COM 对象,\n可选在参数 @2 中指定 COM 对象绑定的容器对象\n\n此函数失败会抛出异常
!winform.createEmbedEx( = 创建嵌入 COM 控件，返回控件容器对象。\n容器对象的 _object 成员是创建的 COM 对象。\n容器对象的 __event__ 成员为 COM 对象默认事件监听器。\n在窗口销毁时解除默认事件监听器并释放 COM 对象。\n\n返回容器已添加元表，可通过容器对象的成员代理访问 COM 对象成员。\n也可以通过指定容器对象的成员函数响应 COM 对象事件
!winform.createEmbedEx(.(clsId,embedObj) = 创建嵌入 COM 控件，返回控件容器对象。\n此函数返回的容器已添加元表并创建代理以直接访问 COM 对象，\n也可以通过指定容器对象的成员函数响应 COM 对象事件。\n\n@clsId 指定控件 CLSID，\n可选在参数 @2 中指定 COM 对象绑定的容器对象。\n\n此函数失败会抛出异常
!winform.createEmbedEx(.(comObject,embedObj) = 嵌入 COM 控件，返回控件容器对象。\n此函数返回的容器已添加元表并创建代理以直接访问 COM对象，\n也可以通过指定容器对象的成员函数响应 COM 对象事件。\n\n参数 @comObject 指定已创建成功的 COM 对象,\n可选在参数 @2 中指定 COM 对象绑定的容器对象。\n\n此函数失败会抛出异常
!winform.tryCreateEmbed( = 创建嵌入控件,返回控件容器对象,\n容器对象的 _object 成员是创建的 COM 对象,\n容器对象可通过添加成员函数响应 COM 对象事件，\n容器对象的主要作用是充当访问 COM 对象的中间代理对象。\n通常使用 util.metaProperty 为容器对象添加属性元表，\n属性元表可拦截属性、函数调用并调用 _object 对象,\n\ncreateEmbedEx 返回的容器已添加默认代理以直接访问 COM 对象
!winform.tryCreateEmbed(.(clsId,embedObj) = 创建嵌入控件,返回控件容器对象,\n容器对象的 _object 成员是创建的 COM 对象,\n容器对象可通过添加成员函数响应 COM 对象事件，\n容器对象的主要作用是充当访问 COM 对象的中间代理对象,\n@clsId 指定控件 CLSID,\n可选在参数 @2 中指定 COM 对象绑定的容器对象\n\n成功返回容器对象,失败返回false,错误信息
!winform.createEmbedEx() = !embedObjectForm.
!winform.createEmbed() = !embedObjectForm.
!winform.tryCreateEmbed() = !embedObjectForm.
!embedObjectForm._form = COM 控件宿主窗口,\n也就创建控件的构造参数中指定的 aardio 窗口对象\n也是控件窗口的上级父窗口,\n!winform.
!embedObjectForm._object = COM 控件对象,\n通过此对象可以访问 COM 对象的成员函数和成员属性,\n 可改造容器对象并在内部调用 _object 以改进 COM 对象接口\n也可以通过指定容器对象的成员函数以响应 COM 对象的事件
!embedObjectForm._host = COM 控件宿主对象
!embedObjectForm._host.close() = 关闭对象
!embedObjectForm._host.adjust() = 自动调整 COM 控件窗口大小
!embedObjectForm._host.tranacc(.(MSG消息对象) = 解析 COM 控件 快捷键,\n如果是快捷键返回真值
!embedObjectForm._host.doObjectVerb( _OLEIVERB__ ) = 执行指定的动词命令
!winform.tooltipCtrl = 提示控件\n该控件需要导入win.ui.tooltip以此窗口为参数手动创建\n!win_ui_tooltip.
!winform.hasBackground = 窗体是否自定义了背景色或背景图像
!winform._defWindowProc(hwnd,message,wParam,lParam) = 调用默认消息回调函数\n该返回必须是当前消息回调函数的返回值\n无返回值会导致再次调用该函数
!winform.disableDragFullWindow = 边框调整窗口大小时是否禁止显示窗口内容\n如果窗口设置了背景、无_WS_CLIPCHILDREN样式则默认为true\n如果系统禁用了该选项则忽略此属性
!winform.pretranslate = @.pretranslate = function( msg ) {\n	__/*消息分发前回调此函数,返回true停止分发*/\n};
!winform.onSize = @.onSize = function( width,height,wParam ) {	 \n	__/*窗口改变大小后会自动触发此事件函数。\n注意 onSize 是 adjust 事件的别名，作用相同\n所有 win.form 创建的窗体和控件都支持 onSize（或 adjust）事件,\n重复赋值 onSize（或 adjust）会追加事件触发器而非替换原来的值。\n\nwidth 参数为窗口客户区宽度,height 参数为窗口客户区高度,\nwParam 参数来自 _WM_SIZE 消息的 wParam 参数，一般不用管。\n一般不建议添加一个 wndproc 仅仅是为了处理  _WM_SIZE 消息，\n定义 onSize 事件是更好的选择。\n \n};*/ 
!winform.adjust = @.adjust = function( cx,cy,wParam ) {	 \n	__/*窗口改变大小后会自动触发此事件函数。\n注意 onSize 是 adjust 事件的别名，作用相同。\n所有 win.form 创建的窗体和控件都支持 adjust 事件,\n重复赋值 adjust 会追加事件触发器而非替换原来的值。\n\ncx 参数为窗口客户区宽度,cy 参数为窗口客户区高度,\nwParam 参数来自 _WM_SIZE 消息的 wParam 参数，一般不用管。\n一般不建议添加一个 wndproc 仅仅是为了处理  _WM_SIZE 消息，\n定义 adjust 事件是更好的选择。\n\n如果主动调用此函数，则检查并执行所有之前添加的 adjust 事件函数。\n省略调用参数时 cx,cy 参数默认设为窗口大小*/  \n}; 
!winform.preadjust = @.preadjust = function( cx,cy,wParam ) {	 \n	__/*窗口缩放后重绘前、触发 adjust 事件之前触发此事件。\n所有 win.form 创建的窗体和控件都支持此事件,\n与 adjust 事件不同，对 preadjust 重复赋值则覆盖而不是追加事件。 \n\ncx 参数为窗口客户区宽度,cy 参数为窗口客户区高度,\nwParam 为 _WM_SIZE 消息参数。*/  \n};
!winform.resize(.(宽度,高度) = 如果指定了参数则调整窗口大小,\n无论是否实际调整窗口大小,发送 _WM_SIZE 消息给窗口以触发子窗口自动调整大小的功能
!winform.onCopyData = @.onCopyData = function(data,dataType){\n	__/*收到 _WM_COPYDATA 消息\ndata 为接收到的字符串值,dataType 为接收到的数值 */\n}
!winform.onActivate = @.onActivate = function(state,hwndOther,minimized){\n	if(state){\n		__/*激活窗口时触发此事件\nstate表示窗口是否激活，可能的值为WA_ACTIVE，WA_CLICKACTIVE，WA_INACTIVE\nhwndOther在激活时表示另外一个取消激活的窗口句柄,取消激活时表示激活的窗口句柄\nminimized指明当前窗口是否最小化状态*/	\n	}\n}
!winform.onMouseActivate = @.onMouseActivate = function(hwndTop,hitTest,message){\n	return _MA___/*鼠标点击并且将要激活窗口时触发此事件\nhwndTop表示被激活的顶层窗口,\nhitTest参数请参考WM_NCHITTEST消息\nmessage为鼠标消息ID\n返回值的作用请参数MSDN*/\n}
!winform.onMouseDown = @.onMouseDown  = function(wParam,lParam){\n	var x,y = win.getMessagePos(lParam);__/*在窗口按下鼠标左键触发此事件*/	\n}
!winform.onMouseClick = @.onMouseClick = function(wParam,lParam){\n	var x,y = win.getMessagePos(lParam);__/*在窗口上单击并弹起鼠标左键触发此事件*/\n}
!winform.onMouseUp = @.onMouseUp = function(wParam,lParam){\n	var x,y = win.getMessagePos(lParam);__/*在窗口上弹起鼠标左键触发此事件。*/\n}
!winform.onMouseDoubleClick = @.onMouseDoubleClick = function(wParam,lParam){\n	var x,y = win.getMessagePos(lParam);__/*在窗口上双击鼠标左键触发此事件*/\n}
!winform.onActivateApp = @.onActivateApp = function(activated,previousThreadId){\n	if(activated){\n		__/*不同的应用程序窗口被激活时触发此事件\n参数 activated 指示窗口是否激活,previousThreadId 则是另一个交接激活状态的线程 ID*/	\n	}\n}
!winform.beforeSystemEndSesssion = @.beforeSystemEndSesssion = function(){\n	__/*即将关机执行此回调，不可执行耗时操作*/\n}
!winform.toolbar = 工具条\n!toolbar.
!winform.menu = !menu.
!winform.valid = 窗口是否有效。\n窗口未关闭返回 true ，已关闭或正在关闭返回 false 。\n注意所有窗口和控件都有这个属性（不一定会提示）
!winform.text = 窗口标题。
!winform.value = 窗口标题。text 属性的别名。
!winform.group() = 将此窗体上所有groupbox范围内的所有其他控件设为groupbox控件的子窗口
!winform.getScale() = 返回 X 轴、Y 轴方向缩放比例，DPI 缩放比例共 4 个返回值,\nscaleX,scaleY,dpiScaleX,dpiScale 。\nwin.ui 创建的所有窗体与控件对象都提供此方法。
!winform.dpiScaleX = 窗口当前使用的DPI横坐标缩放系数,\n该值由界面系统自动维护，任何情况下都不应手动修改,\n\n这是一个以小数表示百分比的数，例如 1.25 表示 125%,\n窗口未使用缩放或未完成缩放初始化时，值可能为 null，\n如果要获取屏幕缩放设置应改用 gdi.getDpiScale 函数
!winform.dpiScaleY = 窗口当前使用的DPI纵坐标缩放系数,\n该值由界面系统自动维护，任何情况下都不应手动修改,\n\n这是一个以小数表示百分比的数，例如 1.25 表示 125%,\n窗口未使用缩放或未完成缩放初始化时，值可能为 null，\n如果要获取屏幕缩放设置应改用 gdi.getDpiScale 函数
!winform.dpiScale(.(x,y) = 将 @x,@y 表示的像素值乘以窗体当前 DPI 缩放倍数并返回,\n省略 @y 参数时仅返回 @x 转换后的值,\n所有 win.ui 创建的窗口或控件都提供这个函数
!winform.enableDpiScaling( = 按系统 DPI 缩放设置自动缩放顶层窗体以及控件字体\n请合理设置该窗体上控件的固定边距、自适应大小等属性\n调用此函数时应交由aardio自动指定参数。\n\n如果当前窗口未禁用缩放,\n则在首次显示前以"init"为参数自动调用此函数。
!winform.enableDpiScaling(.("init") = 如果窗体为禁用 DPI 缩放，\n且尚未执行默认 DPI 自动缩放，则执行该操作，\n\n窗体在首次显示时会以"init"为参数执行此调用,\n如果需要提前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用此函数。
!winform.enableDpiScaling(.(false) = 禁用DPI自动缩放\nwin.ui.disableDpiScaling 设为 false 则全局禁用 DPI 缩放
!winform.enableDpiScaling(.(scaleX,scaleY,suggestedRect) = 所有参数应当使用 win.form 对象 onDpiChanged 事件传入的参数，\n@scaleX,@scaleY 参数为当前 DPI，\n@suggestedRect 参数为建议大小，必须是 null 或 ::RECT 结构体
!winform.statusbar = 状态类\n!statusbar.  
!winform.fullscreen( = 切换全屏,必须在窗口显示以后才能调用此函数。\n注意窗口最小化状态无法全屏。\n\n注意：\n创建有边框的窗口但在之后修改为无边框（或由 win.ui.simpleWindow 自动修改）则全屏可能会失效。
!winform.fullscreen(.(true) = 参数 true 切换到全屏，参数 false 取消全屏，\n不指定参数则切换全屏，返回值表示窗口当前是否全屏状态。
!winform.onCancel = @.onCancel = function(){\n    __/*按下ESC键触发此事件,\n如果全屏窗口定义了此事件,应在此自行退出全屏*/\n}
!winform.onOk = @.onOk = function(){\n    __/*按下回车键触发此事件*/\n}
!winform.onMinimized = @.onMinimized = function(){\n	__/*窗口最小化时回调此函数\n可在此调用 process.emptyWorkingSet() 降低内存占用*/	\n}
!winform.onRestored = @.onRestored = function(wParam){\n	__/*窗口自最小化或最大化恢复时回调此函数\n最大化恢复 wParam 为 _SIZE_MAXIMIZED，最小化恢复为 _SIZE_MINIMIZED*/	\n}
!winform.restoreFullScreen = 当前是否全屏状态
!winform.getCtrlById(__/*输入控件ID*/) = 根据ID返回窗体控件
!winform.getCtrl(__/*输入控件句柄*/) = 根据句柄返回窗体控件对象,\n参数可以是控件句柄，或控件的子窗口句柄
!winform.getCtrlById() =  !static.
!winform.getCtrl() =  !static.
!winform.reghotkey(callback,modifiers,vk) =  @.reghotkey( function(id,modifiers,vk){\n	__/*按下系统热键时触发此回调函数。\nmodifiers 为控制键选项（数值）,使用 _MOD_ 前缀的常量表示,0 为不需要按下控制键。\nvk 为虚拟键码,使用 _VK_ 前缀的常量表示。\n也可以将参数 @2,@3 合并放到 `[modifiers,vk]` 格式的数组里作为参数，\nhotkey 控件的 value 属性返回的就是 `[modifiers,vk]` 格式的数组。\nhotkey 控件的 value 属性返回的就是这种格式的数组*/\n},2/*_MOD_CONTROL*/,'D'#)
!winform.unreghotkey(__/*请输入ID*/) = 注销热键\n如果参数为空，则忽略不做任何操作
!winform.setInterval(回调函数,延时毫秒数,->->->) = @.setInterval( \n	function(){\n		__/*创建定时器。\n参数 @1 指定执行函数,参数 @2 指定执行间隔（单位毫秒）。\n可选指定一个或多个回调参数，回调函数内 owner 参数指向当前窗体。\n\n如果在定时器中执行了 thread.delay 等处理窗口消息的代码，\n在定时器退出前不会再触发同一定时器（重入）。\n\n定时器回调函数无返回值、返回 null 或 true 则继续运行。\n返回 false,0，或用 tonumber 可转换为 0 的值则清除此定时器。\n返回可用 tonumber 转换为非 0 数的值则修改定时器执行间隔（毫秒）\n\n所有控件的 setInterval 都是调用此函数，用法相同*/\n	},1000\n)
!winform.clearTimeout(.(定时器ID) =  删除定时器。\n参数如果为 null 则忽略不执行，\n否则定时器ID必须是 setInterval 函数或setTimeout函 数的返回值。\n\n请注意如果定时器被删除，ID 可能被重新分配给其他定时器。\n在定时器回调函数中返回 0,false 以删除定时器是更稳妥的方式
!winform.clearInterval(.(定时器ID) =  删除定时器。\n参数如果为 null 则忽略不执行，\n否则定时器ID必须是 setInterval 函数或setTimeout函数的返回值。\n\n请注意如果定时器被删除，ID 可能被重新分配给其他定时器。\n在定时器回调函数中返回 0,false 以删除定时器是更稳妥的方式
!winform.changeInterval(.(定时器ID,延时毫秒数) = 重新设定定时器的延时时间\n定时器ID必须是setInterval函数或setTimeout函数的返回值
!winform.changeInterval(.(定时器ID,-1) = 暂停定时器，修改为有效时间后恢复运行。\n定时器 ID 必须是 setInterval 函数或 setTimeout 函数的返回值
!winform.changeInterval(.(定时器ID,延时毫秒数,定时回调函数) = 重新设定定时器的延时时间,并更换定时器回调函数\n定时器ID必须是setInterval函数或setTimeout函数的返回值
!winform.setTimeout(.(函数或代码,延时,其他附加参数) = 推迟执行指定的函数或代码，返回值为定时器 ID 。\n此函数异步执行参数中指定的函数，不会阻塞当前代码继续执行。\n延时参数是可选参数，以毫秒为单位，默认为 0 毫秒。\n可选添加多个调用参数（作为回调延时函数的实参）。\n回调函数内的 owner 参数指向当前控件。
!winform.hwnd = 窗口句柄\n\n句柄是一个数值，用于标识一种系统资源，如窗口、位图等等，\n如果你要操作一种系统资源，必须先获得句柄。 \n\n句柄在aardio中通常转换为指针(pointer)类型，\n而窗口句柄是个特例，一般使用数值类型(在API函数中应指定为addr类型)
!winform.onDpiChanged = @.onDpiChanged = function(dpiX,dpiY,suggestedRect){\n    ??.enableDpiScaling(dpiX/96,dpiY/96,suggestedRect)__//用户在控制面板中修改了屏幕缩放参数\n    \n}
!winform.onDestroy = @.onDestroy = function(){\n    __/*指定在窗体销毁以前执行的代码*/\n    \n}
!winform.saveConfigBeforeDestroy = @.saveConfigBeforeDestroy = function(){\n    __/*用于在窗体销毁前保存配置文件,bindConfig 使用此事件保存配置*/\n    \n}
!winform.beforeDestroy = @.beforeDestroy = function(){\n    __/*指定在窗体销毁以前执行的代码\n早于onDestroy触发*/\n    \n}
!winform.id = 控件ID
!winform.capture = 是否捕获全局鼠标消息
!winform.parent = 返回运行时父窗口。\n返回值为 win.form 窗体或控件对象。\n此属性应当只用于读取，修改运行时父窗体应改用 setParent 函数。\n注意 _parentForm 指向设计时父窗体，运行时不会更改。 \n!winform.
!winform.getParent() = 返回运行时父窗口。\n返回值为 win.form 窗体或控件对象。\n此函数的返回值与 parent 属性相同，读取属性的速度会更快。\n!winform.
!winform.setParent(__/*父窗口对象*/) = 如果父窗口已经是一个子窗口，\n则允许将相同父窗体内窗口对象（包含父窗口本身）设为父窗口。\n此函数会自动调整控件位置并保持自适应缩放设置，其实现比 win.setParent 函数更为复杂。
!winform.disabled = 是否禁用
!winform.isDialogMessage = @.isDialogMessage = function(hwnd,msg){\n	if( msg.message == 0x100/*_WM_KEYDOWN*/){\n		\n		if(  msg.wParam == 0xD/*_VK_RETURN*/ ){ \n			return true;\n		}\n		\n		if( msg.wParam == 0x1B/*_VK_ESC*/ ){\n			return true;\n		}\n		\n		__/*检测键盘信息并确定如何响应对话框的默认快捷键\n调用win.isDialogMessage函数以触发对话框的默认规则\n该函数把WM_GETDLGETDLGCODE发送给窗口，决定如果响应按键\n默认回车触发Z序为1的控件命令,按ESC触发Z序为2的控件命令,\n按tab切换焦点,按down选择下一控制组.\n\n此函数返回true以告知消息处理函数这是一个快捷键，\n返回true将阻止继续分发处理此消息 \n*/\n	}\n	return win.isDialogMessage(hwnd,msg);\n}
!winform.onClose = @.onClose = function(hwnd,message,wParam,lParam){\n    __/*窗体关闭前触发此函数。\n此函数返回除 null , true 以外的值可阻止窗口关闭（使用 `===` 操作符检查返回值）。\n这里的代码要写稳妥一点,在这里抛出异常，\n会导致无法点关闭按钮关闭窗口\n\n用 ::User32.DestroyWindow 将直接销毁窗口并且不会回调 onClose 事件，\n在销毁窗口前执行代码更应当使用 onDestroy 事件而非 onClose 事件*/\n}
!winform.onEnterSizeMove = @.onEnterSizeMove = function(){\n    __/*开始拖动触发此函数*/\n}
!winform.onExitSizeMove = @.onExitSizeMove = function(){\n    __/*结束拖动触发此函数*/\n}
!winform.onEraseBkgnd = @.onEraseBkgnd  = function(hwnd,message,wParam,lParam){\n    return 0;__/*禁止擦除背景。\n只有 win.form 对象支持此事件，\n其他控件可使用 wndproc 拦截 `_WM_ERASEBKGND`消息。*/\n}
!winform.onPaint = @.onPaint  = function(hdc,rcPaint,fErase,width,height){\n    __/*\n此函数已自动调用 ::BeginPaint 与 ::EndPaint。\n回调参数 rcPaint 与 fErase 均为 ::PAINTSTRUCT 结构体的字段。\n回调参数 hdc 为内存绘图设备句柄（已自动实现离屏/双缓冲优化）。\n回调参数 width,height 为客户区大小。\n此函数忽略返回值。\nwin.form 对象定义 onPaint 时如未定义 onEraseBkgnd 则默认将其设为 `lambda() 0`\n除 plus 控件以外的其他控件都支持 onPaint 事件*/\n}
!winform.onGetMinMaxInfo = @.onGetMinMaxInfo = function(hwnd,message,wParam,lParam){\n    __/*设置窗口缩放大小范围,\n用法参考标准库中win.ui.minmax*/\n}
!winform.getMinMaxInfo() = 如果定义了onGetMinMaxInfo,\n必须同时定义此函数返回与win.ui.minmax兼容的结构体
!winform.left = 左侧坐标\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.right = 右侧坐标\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.top = 顶部坐标\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.bottom = 底部坐标\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.height = 高度\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.width = 宽度\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform._defClientRect = 获取窗口设计时大小\n!rect.
!winform.isForm = 标准库 win.ui 创建的所有窗体与控件对象都拥有此属性。\nwin.form 创建的窗体对象返回 true,其他控件对象返回 false 。
!winform.getForm() = 标准库 win.ui 创建的所有窗体与控件对象都拥有此属性。\nwin.form 创建的窗体对象返回自身，其他控件对象返回创建控件的容器窗口（ _parentForm 属性 ）
!winform.orphanWindow( = 如果当前是子窗口,\n移除窗口的WS_CHILD样式，使窗口孤立出来悬浮于原位置,\n悬浮窗口如影随形的跟随父窗口移动或改变大小,控件原来的固定边距等参数仍然有效
!winform.orphanWindow(.(transparent,hwndBuddy,borderless) = 创建悬浮窗口。\n悬浮窗口是模仿子窗口外观效果的独立窗口，父窗口可自动调整子窗口到设定位置。\n可选参数 @transparent 为 true 则转换为分层透明窗口。\n可选利用 @hwndBuddy 参数指定外部进程窗口句柄的并附加在内部控件上以实现相同的效果。\n伙伴窗口总是会保持在悬浮窗口前面，并保持相同的大小、位置。\n可重复调用此函数更换伙伴窗口，旧的伙伴窗口必须自行关闭。\n可选指定 @borderless 参数 为 true 以移除 @hwndBuddy  的窗口边框。
!winform.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置（句柄或_HWND前缀常量）则调整Z序
!winform.getPos() = 返回相对父窗口客户区的坐标,宽,高,\n参数为true返回屏幕坐标,宽,高,\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.inputBox(.(prompt,title,default,cueBannerText,password) = 显示输入对话框，返回用户输入文本，用户取消返回 null 值。\n可使用 `#` 操作检查返回的输入文本的长度（ null 或空字符串都返回 0）。\n- @prompt 参数指定在输入框上面一排显示的输入提示，单行文本，必填。\n- @title 参数指定对输入对话框窗口标题，可选。\n- @default 参数指定输入框中显示的默认文本，可选。\n- @cueBannerText 参数指定输入框为空时在输入框内部以浅色字体显示的提示，可选。\n- @password 参数输入字符是否显示为星号，可选。\n如果 @prompt 参数包含"密码","密钥","password"则 @password 默认为 true。\n\n注意：需要先导入 win.inputBox 库才能使用此函数。
!winform.msgbox(.(text,title,style,timeout) = 弹出对话框\n1. 参数 @text 指定显示的数据，如果指表对象则先序列化为文本。\n参数 @text 是其他类型则调用 tostring 转换为文本。\n2. 可选参数 @title 用于指定信息框标题。\n3. 可选参数 @style 可用字符串或数值指定图标样式（参考 _MB_ 前缀常量值，设为 0 去掉图标与提示音），也可以指定字符串值：\n    * "error","stop","hand" 错误图标\n    * "question" 询问图标，显示是、否、取消按钮\n    - 指定下其他样式名一律退化为默认样式。\n返回值为 `6/*_IDYES*/,7/*_IDNO*/, 2/*_IDCANCEL*/` 之一。\n    * "confirm","test" 询问图标，显示确定与取消按钮，返回值为 `1/*_IDOK*/,2/*_IDCANCEL*/` 之一。\n- "warn" 警告图标\n    * "info" 信息图标。\n4. 可选用参数 @timeout 限定显示时间，以毫秒为单位，超时自动关闭。
!winform.msgboxErr(.(text,title) = 弹出错误对话框\n参数 @text 指定显示的信息，如果指定表对象先序列化为文本。\n其他对象调用 tostring 转换为文本\n可选参数 @title 用于指定信息框标题。\n\n此函数调用 win.msgbox，并设定所有者窗口为当前窗体。
!winform.msgboxTest(.(text,title) = 弹出询问对话框\n参数 @text 指定显示的信息，如果指定表对象先序列化为文本。\n其他对象调用 tostring 转换为文本\n可选参数 @title 用于指定信息框标题。\n\n此函数调用 win.msgbox，并设定所有者窗口为当前窗体。
!winform.msgInfo(.(text,timeout) = 显示提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgWarn(.(text,timeout) = 显示警告提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgOk(.(text,timeout) = 显示正确提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgErr(.(text,timeout) = 显示错误提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgGreat(.(text,timeout) = 显示竖大拇指图标提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgSorry(.(text,timeout) = 显示倒竖大拇指图标提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgSmile(.(text,timeout) = 显示微笑图标提示框。\n参数 @text 指定要显示的文本信息。\n可选使用参数 @timeout 指定延时自动关闭提示框的毫秒数。\n请先导入 win.dlg.message 库以安装此函数
!winform.msgFrown(.(text,timeout) = 显示皱眉图标提示框。\n参数 @text 指定要显示的文本信息。\n可选用参数 @2 指定延时关闭的毫秒数,\n请先导入 win.dlg.message 库以安装此函数
!winform.msgAsk(.(text) = 显示询问提示框。\n参数 @text 指定要显示的文本信息。\n用户按确定或回车返回 true ，其他返回 false 或 null 。\n请先导入 win.dlg.message 库以安装此函数
!winform.tailWndproc = @.tailWndproc = function(hwnd,message,wParam,lParam){\n	__/*添加消息回调函数，并设为最低优先级*/\n}
!winform.wndproc = @.wndproc = function(hwnd,message,wParam,lParam){ \n	__/*追加消息回调函数，不会覆盖之前赋值给 wndproc 的回调函数。\n如果将 wndproc 赋值为表，则表中的键值用于更新窗口消息回调表。\n如果将 wndproc 赋值为 null，则可安全删隃所有消息回调函数并清空消息回调表。*/\n}
!winform.wndproc={} = @.wndproc = {\n	[0x202/*_WM_LBUTTONUP*/] = function(hwnd,message,wParam,lParam){ \n		var x,y = win.getMessagePos(lParam);\n		print("左键按下",x,y);__/*如果将窗口的 wndproc 属性赋值为表。\n则使用表中的键值更新窗口的消息回调表。\n相同消息 ID 相被替换，不同消息 ID 将被合并保留。*/\n	}\n}
!winform.onDropFiles = @.onDropFiles = function(files){\n	__/*接受系统拖放,files是拖放的所有文件路径名数组，\n以管理权限启动的进程操作系统会禁止拖放操作，\n标准库提供了 process.admin.enableDropMsg 函数可以设置这个权限，\n但现在这个设置有可能也是不被允许的*/\n}
!winform.redraw() = 刷新,此函数不会刷新背景缓存,\n刷新背景请调用 redrawBackground 函数,\n成功返回 true
!winform.setRedraw(false) = 禁止重绘
!winform.setRedraw(true) = 恢复重绘
!winform.cmdTranslate = @.cmdTranslate(hwnd,message,wParam,lParam);\n//在父控件wndproc消息回调中调用，用于启用子控件的oncommand事件
!winform.invalidate(.(rect,erase) = 使绘图区域无效并允许刷新,\n参数 @1 使用::RECT结构体指定无效区块,参数 @1 也可以指定子窗口对象\n参数 @2 指定是否擦除背景,\n所有参数可选,默认使全部区块无效并擦除背景
!winform.update() = 重绘invalidate函数指定的区块 
!winform.showChildren(.(SW_->->->) = 显示或隐藏所有子级窗口\n参数用法同show函数
!winform.show( = 显示窗口，并指定显示参数\n默认在显示窗口时会自动缩放窗口以适应系统DPI设置。\n调整控件字体或文本样式的代码建议在窗体显示后再执行。
!winform.show(.() = 显示窗口
!winform.show(.(true) = 显示窗口
!winform.show(.(false) = 隐藏窗口
!winform.show(.(SW_->->->) =  可使用_SW_前缀的常量参数,\n应用程序第一个窗体将忽略窗体的最大化，最小化设计时属性，\n使用 winform.show( 3/*_SW_MAXIMIZE*/ ) 最大化显示,\n使用winform.show( 6/*_SW_MINIMIZE*/ ) 最小化显示,\n使用winform.show( 9/*_SW_RESTORE*/ ) 自最大化或最小化恢复显示。
!winform.getRect() = 窗口区块位置（::RECT结构体）\n!rect.
!winform.getRect(true) = 窗口屏幕区块位置（::RECT结构体）  
!winform.setRect(rc) = 设置窗口区块位置（::RECT结构体）  
!winform.setRect(rc,true) = 设置窗口屏幕区块位置（::RECT结构体） 调用此函数改变窗口大小后,\n应调用 redrawBackground 函数刷新窗口背景缓存
!winform.getClientRect() =  窗口客户区块位置（::RECT结构体）\n!rect.
!winform.clientWidth = 窗口客户区宽度，只读属性。
!winform.clientHeight = 窗口客户区宽度，只读属性。
!winform.toScreen(.(x,y) = 将参数 x,y 指定的当前控件客户区坐标转换为屏幕坐标。\n返回 2 个值：x,y
!winform.toClient(.(x,y) = 将参数 x,y 指定的屏幕坐标转换为当前控件客户区坐标。\n返回 2 个值：x,y
!winform.center(.(目标窗口) = 在目标窗口区域内居中，并调整以保证显示在父窗口或屏幕工作区内。\n\n参数 @1 可指定目标窗口或者目标窗口句柄，设为 0 表示桌面，\n省略目标窗口则默认取父窗口或所有者窗口。\n\n注意 win.form 的构造参数中 left,top 的值为 -1 （默认值）时，\n创建的独立窗口默认就是屏幕居中显示，不必再多调用一次 center 函数。
!winform.font = 控件字体(::LOGFONT结构体)
!winform.theme = 外观主题,例如\nwinform.theme = "Explorer"\nwinform.theme = false
!winform.image = 窗口背景图像。\n赋值可以为图片文件数据或路径。\n如果使用 win.ui.layered 创建分层窗体则支持透明 png 背景图像。\n如果提前导入 inet.http 可也可赋值为图像网址。\n此属性也可以指定一个位图句柄，位图句柄由窗体负责销毁。\n取值时返回位图句柄。\n\n用此属性赋值修改背景图像并不会刷新窗口背景。\n请在必要时调用 redrawBackground 函数刷新。
!winform.bgcolor = 背景颜色
!winform.setBitmap(__/*图片句柄*/) = 设置图片\n成功返回true,自动销毁原来的位图 
!winform.setBitmap(__/*图片句柄*/,false) = 设置图片\n成功返回控件原来的位图句柄,\n必须调用::DeleteObject()函数销毁该句柄 
!winform.getBitmap() = 返回窗体正在使用的背景位图句柄\n该句柄不得删除
!winform.transparentColor = 设置透明颜色，使用 GDI 颜色格式（ 0xBBGGRR 格式）。\n设为 null 时将窗体 transparent 属性设为 false，否则设 transparent 属性为 true 。\n读取值时返回透明颜色值，禁用透明时（transparent 属性返回 false）返回 null。
!winform.opacity = 设置不透明度，可设为 0 到 255（0xFF）范围的值。\n0 为完全透明，255 为完全不透明。\n设为 null 时将窗体 transparent 属性设为 false，否则设 transparent 属性为 true 。\n读取值时返回窗体不透明度，禁用透明时（transparent 属性返回 false）返回 null。\n\n窗口对象可通过添加 setOpacity,getOpacity 方法自定义如何设置或返回透明度。
!winform.transparent = 是否允许窗口透明（设为分层窗口），\n分层窗口必须设置透明色（transparentColor 属性）或不透明度（ opacity 属性 ），\n或者使用 win.ui.layered 等支持分层窗口绘图的库才能正常显示。
!winform.close( = 关闭窗口\n注意不能在 onClose 事件内调用此函数\n\n所有非模态、非 MessageOnly 的独立窗口（ 或存为全局变量的 mainForm 窗口 ）都关闭后，\n将会自动终止 win.loopMessage 创建的消息循环（通常也就是退出界面线程）。\n如果主窗口是其他进程或线程的子窗口，则必须存为全局变量  mainForm，\n否则子窗口关闭时不能自动退出消息循环（无论还有没有其他窗口）。
!winform.close(.() = 立即关闭窗口。\n使用 ::SendMessage 发送关闭窗口消息，等待消息处理完成。
!winform.close(.(true) = 异步关闭窗口。\n使用 ::PostMessage 发送关闭窗口消息，不等待消息处理完成。\n只有在关闭消息处理完成并销毁窗口后才会触发退出界面线程消息循环的规则。
!winform.loadForm("__/*请输入 aardio 文件路径*/") = 创建子窗体（win.form 对象）。\n参数 @1 指定创建窗体的 aardio 代码或者代码文件路径。\n参数 @1 也可以指定构造窗体的函数或者类（首个回调参数接收父窗体对象，其他为附加调用参数）。\n如果创建窗体的代码未用 return 语句返回非 null 值则直接返回创建的窗体。\n可选添加不定个数调用参数，在被加载的窗体内使用 `...` 操作符接收不定个数参数。\n注意`...` 返回的的首个参数是父窗体，owner 参数以及新窗体的 `parent` 属性都指向父窗体。\n\ncustom 控件的 loadForm 函数会将窗体加载为自己的子窗口且自动维护所有子窗口队列,\n显示 custom 控件的一个子窗口其他子窗口就会隐藏（并未关闭或销毁）,\n关闭 custom 的一个子窗口关闭就会自动将其移出子窗口队列。
!winform.preloadForm("__/*请输入 aardio 文件路径*/") = 自代码文件预加载窗体文件，返回延迟初始化的伪窗体对象。\n伪窗体对象的 fake 属性为 true，调用任何其他属性或方法则自动初始化窗口。\n调用 this 方法返回真实窗口对象自身。\n\n可选增加其他参数作为调用外部窗体代码的参数\n\ncustom 控件的 loadForm 函数会将窗体加载为子窗口且自动维护子窗口队列,\n并且 custom 控件会自动维护一个子窗口队列，\n显示一个子窗口其他子窗口就会隐藏（并未关闭或销毁）,\n一个子窗口关闭就会自动移出队列
!winform.doModal( = 显示模态对话框。\n后续可使用 endModal 方法关闭模态对话框。\n调用 endModal 方法的参数会被设置为 doModal 函数的返回值。\n\n模态对话框会自己创建自己的消息泵，\n并阻止调用模态对话框的代码继续向后运行 - 直到模态对话框被关闭。
!winform.doModal(.(ownerForm,showFlags) = 显示为模态对话框。\n可选用参数 @ownerForm 指定所有者窗口，\n参数 @showFlags 可选用 _SW_ 前缀常量指定显示选项。\n\n模态对话框应是独立窗口，并显示在所有者窗口前面。\n模态对话框会暂时禁用所有者窗口 - 直到模态对话框被关闭。\n注意子窗口不应该调用 doModal 函数（禁用父窗口等于禁用自己）
!winform.dialogResult = 模态对话框返回值
!winform.continueModal = 模态对话框是否未关闭
!winform.autoQuitMessage = 此属性显式指定为 false ，\n则禁止在此窗口关闭时自动调用 win.quitMessage 。\n默认在关闭最后一个非模态、非 MessageOnly 的独立窗口（ 或 mainForm 窗口 ）\n时会自动调用 win.quitMessage 函数退出消息循环。
!winform.endModal(__/*请指定模态对话框返回值*/) = 关闭模态对话框，\n调用参数将被设置为 设置为 doModal 函数（启动模态对话框消息泵）的返回值。\n如果不是模态对话框（未调用doModal函数）则此函数忽略不执行任何操作。
!winform.modifyStyle(.(remove,add,swpFlags) = 修改窗口样式,所有参数都是可选参数,\n@remove 用数值指定要移除的样式,可使用 _WS_ 前缀的常量\n@add 用数值指定要添加的样式,可使用 _WS_ 前缀的常量\n@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量\n如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos\n细节请参考 win.modifyStyle 函数源码 
!winform.modifyStyleEx(.(remove,add,swpFlags) = 修改窗口扩展样式,所有参数都是可选参数,\n@remove 用数值指定要移除的样式,可使用 _WS_EX_ 前缀的常量\n@add 用数值指定要添加的样式,可使用 _WS_EX_ 前缀的常量\n@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量\n如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos\n细节请参考 win.modifyStyle 函数源码
!winform.atom(字符串值) = @import win.ui.atom \nvar atom,hwndConflict = winform.atom("__/*输入唯一标识字符串。\n可使用“aardio 工具»编码»GUID 生成与转换”生成全球唯一 ID 。*/");\nif(!atom){\n	/*为窗口设置原子值可以避免一个程序重复运行多个实例*/\n	win.quitMessage();//程序退出\n	return;\n};
!winform.hitCaption() = 模拟拖动顶层父窗口标题栏\n此函数会调用 winform.setTimeout 异步延时0毫秒后实际执行,\n异步执行可避免通过当前线程异步RPC服务器调用此函数导致的问题.\n通常在无边框窗口的 winform.onMouseDown 事件中调用此函数
!winform.hitMin() = 模拟点击顶层父窗口最小化按钮
!winform.hitMax() = 模拟点击顶层父窗口最大化、还原按钮\n返回值为是否最大化指令
!winform.hitClose() = 模拟点击顶层父窗口关闭按钮
!winform.hitTopleft() = 模拟拖动窗口边框左上角
!winform.hitTop() = 模拟拖动窗口边框顶边
!winform.hitTopright() = 模拟拖动窗口边框右上角
!winform.hitLeft() = 模拟拖动窗口边框左边
!winform.hitRight() = 模拟拖动窗口边框右边
!winform.hitBottomleft() = 模拟拖动窗口边框左下角
!winform.hitBottom() = 模拟拖动窗口边框下边
!winform.hitBottomright() = 模拟拖动窗口边框右下角
!winform.setFocus() = 设为输入焦点
!winform.expand = 是否使用九宫格拉伸方式显示背景图
!winform.bkLeft = 贴图或切图坐标:左
!winform.bkTop = 贴图或切图坐标:上
!winform.bkRight = 贴图或切图坐标:右
!winform.bkBottom = 贴图或切图坐标:下
!winform.bindConfig(configFile,propertyMap) = @.bindConfig( config.winform,{\n	edit = "text";\n	radiobutton = "checked";\n	checkbox = "checked";\n	combobox = "selIndex";\n	plus ={\n		["^chk"] = "checked";\n		["^edit"] = "text";\n	};\n	__/*参数 @configFile 指定配置文件（ fsys.table 对象或者 fsys.config 对象的成员 ）。\n参数 @propertyMap 指定配置文件绑定控件属性的规则,\n每条规则指定一个键值对,键名指定控件名或类名,值指定要绑定到配置文件的属性名,\n值如果是一个表,表中的键指定用于匹配控件名称的模式匹配表达式,值为要绑定的控件属性名\n\n如果需要保存窗体位置请先调用 win.util.savePosition\n\nfsys.config 或 fsys.table 并非实时读写，而是将配置读入内存。\n所以请不要多对象、多线程、多进程打开同一配置文件。\n这会导致多份不同步的配置写入存储设备时会相互覆盖。\n多进程可利用原子窗体、进程互斥体避免冲突，\n多线程可通过 winform 成员函数转发到界面线程操作配置文件即可*/\n} );
!winform.messageOnly() = 将窗口转换为message-only window\n该窗口不可见,仅用于消息分发\n此函数返回值为窗体对象自身\n!winform.
!winform._messageOnly = 是否 message-only window
!winform.eachControl() = !static.
!winform.eachControlEx() = !static.
!winform.eachControlEx("类名") = @for(hwnd,ctrl in ??.eachControlEx(__/*可选指定类名\n遍历窗口上所有控件,包含匿名控件,不关心父子级顺序或Z序*/) ){\n	\n}
!winform.eachControl("类名","控件名模式") = @for(name,ctrl in ??.eachControl(__/*可选指定类名,\n可选指定控件名模式匹配串,\n遍历窗口上所有控件,不包含匿名控件,不关心父子级顺序或Z序*/) ){\n	\n}
!winform.enumControl(回调函数,类名) = @.enumControl( function(ctrl){\n	__/*枚举窗体上的所有控件,包含匿名控件\n此函数保证枚举窗口的顺序是先父级控件窗口后子级窗口最后再遍历独立窗口，例如 orphanWindow\n在枚举过程不能调用win.setParent函数改变被枚举控件的父窗口*/\n})
!winform.remove(.("控件名字") = 移除控件
!winform.add(controlsPropertiesTable) = @.add( \n	button = { \n		cls="button";bottom=164;right=147;left=8;top=123;z=1;text="自定义ID控件";id=123;autoResize=false;\n	};__/*参数 @controlsPropertiesTable 中的每个键值对描述一个创建控件的参数\n其中键为字符串时指定控件的访问名字，如果窗体存在同名成员控件或先关闭该控件。\n如果键为数值索引则创建匿名控件，不会覆盖冲突其他控件。\n\n返回值为创建成功的控件对象列表，返回表的键为创建控件指定的键,值为控件对象*/ \n)
!winform.clear() = 清除窗口上的所有控件
!winform.registCommand(回调函数,重写ID) = @.registCommand(\n	function(id,event){\n		win.msgbox( id ); \n	}__/*可选指定ID，不指定则生成并返回新ID*/\n)
!winform.ready( = 在窗体准备就绪并即将显示或处理消息前执行指定的函数。\n指定的函数在以下时机执行且只会执行一次：\n1. 窗体即将显示（但不是最小化）\n2. 主动或自动调用 enableDpiScaling("init") 之前\n3. win.loopMessage / doModal 启动消息循环之前\n如果以上任一阶段已经触发过 ready 注册的函数，\n则后续所有用 ready 注册的函数将延迟到下一次处理窗口消息时执行。\n\n注意 win.ui 所有控件都提供作用相同的 ready 方法（智能提示可能无此方法）。
!winform.ready(.(onReady,->->->) =  可对 ready 以属性赋值方式追加回调函数。\n也可以将 ready 作为方法追加参数 @onReady 指定的回调函数，\n其他可选的参数将作为回调 @onReady 的参数。\n回调 @onReady 时 owner 参数将指向当前窗体或控件。
!winform.translateAccelerator = @.translateAccelerator = function(msg){\n	if(  msg.wParam == 0x20/*_VK_SPACE*/ && msg.message = 0x101/*_WM_KEYUP*/){ \n		return true;__/*返回是否快捷键,适用窗体或普通控件对象\n仅当前窗口内的按键触发此事件\n\nmsg 参数为包含窗口按键消息的 ::MSG 结构体*/\n	} \n}
!winform.preTranslateAccelerator = @.preTranslateAccelerator = function(msg){\n	if(  msg.wParam == 0x20/*_VK_SPACE*/ && msg.message = 0x101/*_WM_KEYUP*/){ \n		return true;__/*返回是否快捷键\n在 translateAccelerator 之前执行,仅适用于窗体不适用于控件\n当前窗口以及子窗口上的按键都会触发此事件\nwin.ui.accelerator 绑定窗体时将自动添加该事件\n\nmsg 参数为包含窗口按键消息的 ::MSG 结构体*/\n	} \n}
!winform.beforeShowWindow =  @.beforeShowWindow = function(shown,status){ \n	__/*窗体显示或隐藏前触发此事件\nshown 参数指示窗体是否显示,status 参数请参考 _WM_SHOWWINDOW 消息的 lParam 参数*/\n} 
!winform.onPosChanged =  @.onPosChanged = function(flags,hwndInsertAfter,x,y,cx,cy){ \n	__/*窗体接收到 _WM_WINDOWPOSCHANGED 消息\nflags 可能的值为 _SWP_SHOWWINDOW,_SWP_NOMOVE,_SWP_NOSIZE 等常量按位或的值\n所有参数为 WINDOWPOS 结构体展开的字段,请参考该结构体文档*/\n} 
!winform.applyDisableDragFullWindow(callback) = @.applyDisableDragFullWindow(\n	function(disabled){\n		__/*检测窗口的disableDragFullWindow属性并回调此函数,\ndisabled为true表示临时禁用了拖动显示窗口内容*/\n	} \n);
!winform.wait(.(等待函数,超时,延时间隔) = 循环执行等待函数，并等待非 null 返回值。\n当等待函数的第 1,第 2 个返回值不全等于 null 值，或当前窗口关闭都会停止等待。\n等待函数返回的值也就是 wait 函数的返回值（最多转发 3 个返回值）。\n如果指定超时，超过指定毫秒时返回 null 。\n除等待函数以外，所有参数可选
!winform.waitUntil(.(等待函数,超时,延时间隔) = 循环执行等待函数，并等待返回真值（Truthy）。\n当等待函数的首个返回值为真值（Truthy） ，或当前窗口关闭都会停止等待。\n等待函数首个返回值也就是 waitUntil 函数的返回值（仅返回单个值）。\n如果指定超时，超过指定毫秒时返回 null 。\n除等待函数以外，所有参数可选
!winform.sendMessage(.(msg,wParam,lParam) = 发送窗口消息\n此函数用法请参考 ::User32.SendMessage
!winform.postMessage(.(msg,wParam,lParam) = 投递窗口消息到消息队列中\n此函数用法请参考 ::User32.PostMessage
!winform.publish("__/*发布消息名*/",) = 在窗口所在界面线程发布消息,\n运行界面线程所有所有调用subscribe函数订阅此消息的函数,\n可添加任意个触发参数
!winform.getFont() = 返回窗口 LOGFONT 字体，\n返回对象的 h 值会按窗口的 DPI 缩放设置自动还原为缩放前大小。\n!logfont.
!winform.getFont(true) = 返回窗口 LOGFONT 字体，\n返回对象的 h 值为字体实际大小，不会按窗口 DPI 设置还原。\n返回字体会设置 noScale 属性为 true,\n使用窗口的 setFont 函数或赋值 font 属性时，\nnoScale 属性为 true 的字体同样不会进行自动 DPI 缩放\n!logfont.
!winform.background = win.ui.background对象,负责绘制窗口背景,\n此对象仅用于标准库内部调用,用户不应访问此对象
!winform.background.update() = 更新背景缓存,此函数一般不应主动调用,应避免频繁调用
!winform.background.getCacheBitmap() = 获取窗体背景缓存位图句柄,\n请不要滥用或释放该位图句柄
!winform.onMinimize = @.onMinimize = function(lParam){\n	return true;__/*用户点击最小化按钮触发此事件,\n这里返回true可阻止默认消息传递,取消最小化过程*/\n}
!winform.onDrawBackground  = @.onDrawBackground = function(hdc,rc){\n    gdi.fillRect(hdc,0x00008C,rc.copy(,150));\n    gdi.fillRect(hdc,0x468C00,rc.copy(200));\n    \n    var bmp = com.picture.loadBitmap("~\extensions\wizard\project2\forms\images\winform.jpg");\n    gdi.drawBitmap(hdc,bmp,rc.move(200,150),140,140,100,225);\n   \n    var font = ::LOGFONT(weight=800;color=0xFF);\n    gdi.drawTextCenter(hdc,font,"改变窗口大小试试,任意位置贴图都可以支持九宫格",rc.move(120,150));\n    __/*窗口背景绘图时触发此事件，hdc 为窗口背景的内存绘图设备（不必再用双缓冲）,rc 为绘图区块*/\n}
!winform.onDrawBackgroundEnd = @.onDrawBackgroundEnd = function(hdc,rc){\n    __/*窗口背景重绘完成触发此事件，\nhdc 为内存绘图设备（不必再用双缓冲）*/\n}
!winform.redrawBackground() = 刷新窗口背景缓存以及窗口内容,\n调用此函数后不需要再重复调用 redraw 函数,\n此函数不宜过多调用,普通刷新且不需要刷新背景缓存时应改用redraw函数,\n仅bk,bkplus等无窗口控件需要使用此函数刷新,\n调整窗口大小后需要使用此函数刷新窗口背景缓存
!winform.onDirectDrawBackground = @.onDirectDrawBackground = function(hdc,graphics){\n    __/*作为子窗口使用时,可在此回调函数内直接在父窗口背景上绘图,\nhdc为父窗口绘图设备句柄,如果父窗口使用GDI+绘图则graphics为父窗口画布*/\n}
!winform.reduce(array,callback,debounce) = @.reduce(\n	[__/*参数 1 @array 指定要循环处理每个元素的数组或表。\n@array 指定为 false 则取消之前创建的防抖单例循环。\n\n参数 2 @callback 指定回调函数。\n\n    回调函数中可返回本次间隔延时，以毫秒为单位。\n    返回 0、null、false、以及不能转换为非 0 数的值中断处理。\n    回调参数为：当前数组元素值,当前索引,数组长度,本轮动画已执行毫秒数,\n    处理到数组尾部时回调参数 @1 为 null,\n    如果此时仍然返回可转换为非 0 数的值,将转到第一个数组元素重复循环。\n\n参数 3 @debounce 指定是否创建为防抖单例循环，默认为 true。*/],\n	function(value,index,length,currentTime){\n		if(value){\n			var duration = 2000;\n			var x = currentTime/duration;\n			var change = 1+length*(x * x * x * x);\n			var delay = (duration / length) / change;\n			return delay;\n		}\n	} \n)
!winform.trackerGroup("__/*分组名*/") = 获取plus控件、或任何其他应用win.ui.tracker的控件创建的单选分组当前选定控件\n如果未创建任何分组,此函数不可使用
!winform.getRoot() = 获取顶层父窗口，这个函数会查找 orphanWindow 的父窗口
!winform._parentForm = 创建该控件的父窗口（win.form对象）,\n设计时窗体容器是所有拖放在窗体上的控件的 _parentForm,\n\n即使窗口移除子窗口样式、更改父子关系，或以 orphanWindow显示,\n控件的 _parentForm 始终都不会改变\n!static.
!winform._defWindowProc(hwnd,message,wParam,lParam) = 用于在 wndproc 回调中提前调用默认窗口回调函数,\n所有窗口和控件定义了 wndproc 回调以后会自动创建这个函数,\n调用此函数以后,wndproc 必须指定非 null 返回值,\n以避免再次重复调用默认回调函数
!winform.onThreadCallBackReturn = @.onThreadCallBackReturn = function(result){\n	__/*处理 _WM_THREAD_CALLBACK 消息时调用窗口函数后触发此事件,\n参数为调用窗口函数的返回值,可返回新的返回值,\n此消息最终会将返回值转换为数值*/return result;\n} 
!winform.onTrayMessage = @.onTrayMessage = {\n	[0x205/*_WM_RBUTTONUP*/  ] = function(wParam){ \n		win.setForeground(winform.hwnd)__/*响应托盘图标默认消息 _WM_TRAYMESSAGE，_WM_RBUTTONUP 为鼠标右键点击，\n弹出托盘菜单以前,一定要前置主窗口中,不然不点击菜单不会消失*/\n		winform.popmenu.popup() \n	};\n	[0x202/*_WM_LBUTTONUP*/] = function(wParam){ \n		\n	};\n	[0x203/*_WM_LBUTTONDBLCLK*/] = function(wParam){ \n		\n	};\n	[0x404/*_PARAM_DESTROY*/] = function(wParam){ \n		\n	};\n	[0x405/*_PARAM_CLICKED*/] = function(wParam){ \n		\n	};\n}
!winform.? = 请指定窗体上的控件名称。\n将创建窗体的代码置入窗体设计器生成的代码中，\n自『设计视图』切找到『代码视图』，aardio 才能显示控件对象的智能提示。\n!static.
!winform.fake = 是否伪窗口。\n伪窗口并未真正初始化，\n在访问伪窗口除 fake 以外的窗性和方法时才会真正初始化。\n在创建窗口后，伪窗口将成为真实窗口的代理对象。 \n\n伪窗口通过 this 函数可初始化窗口并直接返回真实窗口对象。\n伪窗口初始化后可触发 onCreated 事件，回调参数为创建的真实窗口。
!winform.this() = 如果是伪窗口，初始化窗口并返回已初始化的真实窗口对象。\n否则返回窗口对象自身。
!winform.visible = 当前窗口是否显示。\n仅检查当前窗口的可见性样式（窗口 是否具有 _WS_VISIBLE 样式）。\n不考虑父窗口是否可见，不考虑是否被其他窗口遮挡。\n如果需要同时判断父窗口的可见性，应改用 win.isVisible 函数。
!winform.onCreated = @.onCreated = function(realForm){\n	__/*伪窗口初始化为真实窗口时触发此函数。\nrealForm 参数为创建的真实窗口*/\n}
!winform.setIcon( = 设置窗口图标。
!winform.setIcon(.(hSmall,hBig,gc) = 参数 @hSmall 指定小图标句柄\n参数 @hBig 指定大图标句柄。\n窗口显示小图标，ALT+TAB 显示大图标，任务栏则根据设置选择大图标或小图标。 \n小图标合适的分辨率为 16x16xdpiScale 。\n大图标合适的分辨率为 16x16xdpiScale 。\n可选参数 @gc 为 true 则由窗口对象负责释放指定的图标。\n共享图标不能将 @gc 指定为 true 。\n如果 @gc 为 true 且图标是托管句柄（cdata）则仅添加与解除引用，不会执行 ::DestroyIcon 。\n但释放普通图标句柄会调用 ::DestroyIcon （因此  @gc 为 true 时要避免与其他窗口共用 ）。\n\n如果窗口之前使用的图标也是由窗口负责释放则函数会返回 null 值。\n否则返回窗口之前的小图标句柄,大图标句柄。
!winform.setIcon(.(filePath) = - 参数 @icoFilePath 指定复合图标（*.ico）文件路径。\n自 @filePath 加载适合窗口的小图标与大图标并设为窗口图标。\n传入图标路径时会自动计算 DPI 并选择最合适的图标。\n建议在 afterDpiChanged 回调中调用此方法。\n@filePath 不能指定内存数据或资源文件（仅能加载默认分辨率）\n改用 win.image.loadIconFromFile 可自内存加载指定分辨率的图标。\n\n自文件加载图标时，图标的生命周期由窗口自动管理。\n如果窗口之前设置的图标也是由窗口负责释放则会返回 null 值。\n否则返回窗口之前的小图标句柄,大图标句柄。
!winform.setIcon(.() = 移除窗体图标并返回原来的小图标与大图标句柄
!winform.beforeDpiChanged = @.beforeDpiChanged = function(scaleX,scaleY,origScaleX,origScaleY){
    __/*当前窗口即将执行 DPI 操放操作，\n返回值全等为 false 则取消默认缩放处理。\n所有 win.ui 窗口或控件都支持此回调。\n\n参数 scaleX,scaleY 为 DPI 缩放比例（例如 2 表示 200% 缩放）。\norigScaleX,origScaleY 为之前的缩放比例。\n\n注意这个事件是在 enableDpiScaling 方法调用内部触发，\n并非是在由系统回调的 onDpiChanged 事件之前触发。*/
}
!winform.afterDpiChanged = @.afterDpiChanged = function(scaleX,scaleY,origScaleX,origScaleY){
    ??.setIcon("/app.ico");__/*当前窗口已完成 DPI 操放操作，忽略返回值。\n所有 win.ui 窗口或控件都支持此回调。\n\n参数 scaleX,scaleY 为 DPI 缩放比例（例如 2 表示 200% 缩放）。，\norigScaleX,origScaleY 为之前的缩放比例。*/
}
!winform.onKeyDown = @.onKeyDown = function(keyCode,lParam,repeat){
	__/*按下键盘键回调此函数\nkeyCode 虚拟键码\nlParam 为 _WM_KEYDOWN 消息回调参数\nrepeat 为是否连续按键\n\n如果需要支持更多按键与鼠标事件，请改用 win.ui.tracker*/
}
!winform.onKeyUp = @.onKeyUp = function(keyCode,lParam){
	__/*放开键盘键回调此函数\nkeyCode 虚拟键码\nlParam 为 _WM_KEYUP 消息回调参数\n\n如果需要支持更多按键与鼠标事件，请改用 win.ui.tracker*/
}
!winform.invoke(threadFunction,->->->) = @.invoke(\n	function(...){\n		__/*\n		在创建当前窗口的线程执行回调函数（等待并获取函数返回值）。\n		owner 参数指向当前窗口（真实对象而非线程代理），其他附加参数转发为回调参数。\n		\n		工作线程本就可以直接调此对象的属性或方法（在界面线程内执行）。\n		但 invoke 方法适合在界面线程批量执行连续的代码，并创建安全的闭包上下文。\n		\n		此函数属于线程回调函数，应遵守线程规则，所有数据自参数与返回值交换。\n		不可直接访问线程函数外部的对象（不同线程拥有隔离的上下文）。\n		\n		此函数主要用于跨线程调用界面线程的对象。\n		*/	\n	}\n)
!winform.click(.(x,y) = 向窗口发送模拟鼠标按下与弹起的消息。\n可选用 x,y 指定窗口客户区坐标，默认为 0,0 。\nwin.ui 所有窗口与控件对象都支持此方法。
end intellisense***/