/***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( = 创建嵌入控件,返回控件容器对象,\n容器对象的 _object 成员是创建的 COM 对象,\n容器对象可通过添加成员函数响应 COM 对象事件，\n容器对象的主要作用是充当访问 COM 对象的中间代理对象。\n此函数返回的容器已添加元表并创建代理以直接访问 COM 对象
!winform.createEmbedEx(.(clsId,embedObj) = 创建嵌入控件,返回控件容器对象,\n此函数返回的容器已添加元表并创建代理以直接访问 COM 对象,\n@clsId 指定控件 CLSID,如果控件不是自内存加载,\n则可省略 @clsId 并由 firstCoClassId函数自动获,\n可选在参数@2中指定 COM 对象绑定的容器对象\n\n此函数失败会抛出异常
!winform.createEmbedEx(.(comObject,embedObj) = 嵌入 COM 控件,返回控件容器对象,\n此函数返回的容器已添加元表并创建代理以直接访问 COM 对象,\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._hasBeenDestroyed = 窗体是否已销毁\n请勿修改该值
!winform.pretranslate = @.pretranslate = function( msg ) {\n	__/*消息分发前回调此函数,返回true停止分发*/\n};
!winform.adjust = @.adjust = function( cx,cy,wParam ) {	 \n	__/*窗口缩放后会自动触发此函数。\ncx 参数为窗口客户区宽度,cy 参数为窗口客户区高度,\nwParam 参数请参考 _WM_SIZE 消息参数说明,一般不用管。\n\n所有 win.form 创建的窗体和控件都支持此事件,\n重复赋值只会追加而不会覆盖此事件。\n一般不建议添加一个 wndproc 仅仅是为了处理  _WM_SIZE 消息，\n定义 adjust 事件是更好的选择。\n\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.onMouseDoubleClick = @.onMouseDoubleClick = function(wParam,lParam){\n	var x,y = win.getMessagePos(lParam);__/*在窗口上双击鼠标左键触发此事件*/\n}
!winform.onActivateApp = @.onActivateApp = function(activated,threadId){\n	if(activated){\n		__/*不同的应用程序窗口被激活时触发此事件\nactivated窗口是否激活,threadId是另一个交接激活状态的线程ID*/	\n	}\n}
!winform.beforeSystemEndSesssion = @.beforeSystemEndSesssion = function(){\n	__/*即将关机执行此回调，不可执行耗时操作*/\n}
!winform.toolbar = 工具条\n!toolbar.
!winform.menu = !menu.
!winform.valid = 窗口是否有效\n如果用户关闭窗体则返回false
!winform.text = 窗口标题
!winform.group() = 将此窗体上所有groupbox范围内的所有其他控件设为groupbox控件的子窗口
!winform.getScale() = 返回X轴、Y轴方向缩放比例，DPI缩放比例共4个返回值,\nscaleX,scaleY,dpiScaleX,dpiScale
!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注意窗口最小化状态无法全屏
!winform.fullscreen(.(true) = 参数true切换到全屏,参数false取消全屏,\n不指定参数则切换全屏,\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.restoreFullScreen = 当前是否全屏状态
!winform.getCtrlById(__/*输入控件ID*/) = 根据ID返回窗体控件
!winform.getCtrl(__/*输入控件句柄*/) = 根据句柄返回窗体控件对象,\n参数可以是控件句柄，或控件的子窗口句柄
!winform.getCtrlById() =  !static.
!winform.getCtrl() =  !static.
!winform.reghotkey(回调函数,控制键,虚拟键码) =  @.reghotkey( function(id,mod,vk){\n	__/*按下系统热键时触发此回调函数\nmod为控制键,使用_MOD_前缀的常量表示,0为不按下控制键,\nvk为虚拟键码,使用_VK_前缀的常量表示*/\n},0x2/*_MOD_CONTROL*/,'D'#)
!winform.unreghotkey(__/*请输入ID*/) = 注销热键\n如果参数为空，则忽略不做任何操作
!winform.setInterval(回调函数,延时毫秒数,->->->) = @.setInterval( \n	function(){\n		__/*参数@1指定执行函数,参数@2指定执行间隔，\n可选指定一个或多个回调参数，不指定回调参数则默认为:\n hwnd,message,timerId,tick,\n\n如果在定时器中执行了win.delay等继续消息循环的代码，\n在定时器退出前不会再触发同一定时器（重入）。\n\n定时器回调函数返回数值可修改时间间隔,\n返回false取消该定时器*/\n	},1000 \n)
!winform.clearTimeout(.(定时器ID) =  删除定时器\n参数如果为null则忽略不执行\n否则定时器ID必须是setInterval函数或setTimeout函数的返回值
!winform.clearInterval(.(定时器ID) =  删除定时器\n参数如果为null则忽略不执行\n否则定时器ID必须是setInterval函数或setTimeout函数的返回值
!winform.changeInterval(.(定时器ID,延时毫秒数) = 重新设定定时器的延时时间\n定时器ID必须是setInterval函数或setTimeout函数的返回值
!winform.changeInterval(.(定时器ID,延时毫秒数,定时回调函数) = 重新设定定时器的延时时间,并更换定时器回调函数\n定时器ID必须是setInterval函数或setTimeout函数的返回值
!winform.setTimeout(.(函数或代码,延时,其他附加参数) = 推迟执行指定的函数或代码\n此函数异步执行参数中指定的函数，不会阻塞当前代码继续执行，\n延时参数是可选参数，以毫秒为单位，默认为0毫秒\n可选用附加参数指定调用延时函数的实参\n返回值为定时器ID
!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父窗口应当是一个winform对象\n!!winform.
!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 值可阻止窗口关闭。\n这里的代码要写稳妥一点,在这里抛出异常，\n会导致无法点关闭按钮关闭窗口\n\n调用 ::User32.DestroyWindow 函数可跳过 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}
!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 = 是否窗体对象,\n窗体：使用 win.form 类创建的对象 \n窗口：泛指所有窗体或控件创建的窗口
!winform.getForm() = 返回窗口对象自身\n标准库中所有控件实现了同名函数用于返回控件所在窗口
!winform.orphanWindow( = 如果当前是子窗口,\n移除窗口的WS_CHILD样式，使窗口孤立出来悬浮于原位置,\n悬浮窗口如影随形的跟随父窗口移动或改变大小,控件原来的固定边距等参数仍然有效
!winform.orphanWindow(.(transparent,hwndBuddy) = 创建悬浮窗口,\n悬浮窗口仍然显示在原来的位置,\n可选参数 @transparent 如果为 true 则转换为分层透明窗口,\n可选利用 @hwndBuddy 参数将只有句柄的窗口托管在悬浮窗口之上实现相同的效果,\n伙伴窗口总是会保持在悬浮窗口前面，并保持相同的大小、位置\n可重复调用此函数更换伙伴窗口，旧的伙伴窗口必须自行关闭
!winform.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置（句柄或_HWND前缀常量）则调整Z序
!winform.getPos() = 返回相对父窗口客户区的坐标,宽,高,\n参数为true返回屏幕坐标,宽,高,\n\n如果当前窗口未禁用缩放,\n则在首次显示前自动调用 enableDpiScaling 函数,\n如果需要在此之前获取 DPI 缩放后的窗口大小或位置,\n应当先手动调用 enableDpiScaling 函数
!winform.msgbox("__") = 弹出对话框\n参数@1指定显示的数据,如果是表对象先序列化为文本,\n其他对象调用tostring转换为文本\n\n可选在参数@2中指定标题,\n可选在参数@3中用_MB_前缀的常量自定义样式,设为0去掉图标以及提示音,\n\n此函数调用win.msgbox,但设定父窗口为当前窗体
!winform.msgboxErr("__") = 弹出错误对话框\n参数@1指定显示的数据,如果是表对象先序列化为文本,\n其他对象调用tostring转换为文本\n可选在参数@2中指定标题,\n\n此函数调用win.msgbox,但设定父窗口为当前窗体
!winform.msgboxTest("__") = 弹出询问对话框\n参数@1指定显示的数据,如果是表对象先序列化为文本,\n其他对象调用tostring转换为文本\n可选在参数@2中指定标题,\n\n此函数调用win.msgbox,但设定父窗口为当前窗体
!winform.msgInfo(__) = 显示提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgWarn(__) = 显示警告提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgOk(__) = 显示正确提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgErr(__) = 显示错误提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgGreat(__) = 显示竖大拇指图标提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgSorry(__) = 显示倒竖大拇指图标提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgSmile(__) = 显示微笑图标提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgFrown(__) = 显示皱眉图标提示框,\n可选用参数@2指定延时关闭的毫秒数,\n请先导入win.dlg.message以安装此函数
!winform.msgAsk(__) = 显示询问提示框\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	__/*添加消息回调函数*/\n}
!winform.wndprocMap = @.wndproc = {\n	[0x202/*_WM_LBUTTONUP*/] = function(hwnd,message,wParam,lParam){ \n		var x,y = win.getMessagePos(lParam);\n		io.print("左键按下",x,y)\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.center(.(目标窗口句柄) = 居中窗口,并调整以保证显示在可见范围内\n目标窗口句柄如果为空则取父窗口或所有者窗口,为0表示桌面
!winform.font = 控件字体(::LOGFONT结构体)
!winform.clientRect =  获取控件客户区块位置（::RECT结构体）
!winform.theme = 外观主题,例如\nwinform.theme = "Explorer"\nwinform.theme = false
!winform.image = 窗口背景图像\n赋值可以为图片文件数据或路径\n也可以是位图句柄,位图句柄由窗体负责销毁\n取值时返回位图句柄\n\n用此属性赋值修改背景图像并不会刷新窗口背景,\n请在必要时调用 redrawBackground() 函数刷新
!winform.bgcolor = 背景颜色
!winform.setBitmap(__/*图片句柄*/) = 设置图片\n成功返回true,自动销毁原来的位图 
!winform.setBitmap(__/*图片句柄*/,false) = 设置图片\n成功返回控件原来的位图句柄,\n必须调用::DeleteObject()函数销毁该句柄 
!winform.getBitmap() = 返回窗体正在使用的背景位图句柄\n该句柄不得删除
!winform.transparent(false) = 取消窗口透明
!winform.transparent(true) = 启用分层窗口,不设置透明度\n设为分层窗口以后不应再改变窗口大小
!winform.transparent(128,225) = 启用分层窗口,设置窗口透明度，\n参数(透明度,透明颜色)\n如果指定了透明颜色，透明度参数将被忽略
!winform.close() = 关闭窗口\n注意不能在 onClose 事件内调用此函数\n\n所有非模态、非 MessageOnly 的独立窗口（ 或 mainForm 窗口 ）都关闭后，\n将会自动终止 win.loopMessage 创建的消息循环（通常也就是退出界面线程）
!winform.loadForm("__/*请输入aardio文件路径*/") = 加载外部窗体文件,\n如果该窗体未用 return 语句返回非 null 值则直接返回创建的窗体，\n可选增加其他参数作为调用外部窗体代码的参数\n\ncustom 控件的 loadForm 函数会将窗体加载为子窗口且自动维护子窗口队列,\n并且 custom 控件会自动维护一个子窗口队列，\n显示一个子窗口其他子窗口就会隐藏（并未关闭或销毁）,\n一个子窗口关闭就会自动移出队列
!winform.doModal( = 此函数弹出模态对话框，可使用 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.endModal(__/*请指定模态对话框返回值*/) = 关闭模态对话框，\n调用endModal()函数的参数会被设置为 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建议使用GUID生成Globally Unique Identifier(全球唯一标识符) */");\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(配置文件,属性映射表) = @.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	__/*参数@1指定fsys.config生成的配置文件对象,\n参数@2指定配置文件绑定控件的规则,\n每条规则指定一个键值对,键名指定控件名或类名,值指定要绑定的属性名,\n值如果是一个表,表中的键指定控件名模式匹配表达式,值为要绑定的属性名\n\n如果需要保存窗体位置请先调用 win.util.savePosition*/\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 = @.add( \n	button = { \n		cls="button";bottom=164;right=147;left=8;top=123;z=1;text="自定义ID控件";id=123;autoResize=false;\n	};__/*参数中的每个键值对描述一个创建控件的参数\n其中键为字符串时指定控件名字,如果窗体存在同名成员控件或先关闭该控件,\n如果键为数值索引则创建匿名控件,不会覆盖冲突其他控件,\n\n返回值为创建成功的控件对象列表,其中键为创建控件指定的键,值为控件对象*/ \n)
!winform.registCommand(回调函数,重写ID) = @.registCommand(\n	function(id,event){\n		win.msgbox( id ); \n	}__/*可选指定ID，不指定则生成并返回新ID*/\n)
!winform.onInitDialog = @.onInitDialog = function(hwnd,message,wParam,lParam){\n	??.center()__/*模态对话框初始化完成触发该函数*/\n}
!winform.translateAccelerator = @.translateAccelerator = function(msg){ \n	__/*返回是否快捷键,适用窗体或普通控件对象\n仅当前窗口上的按键触发此事件*/\n} 
!winform.preTranslateAccelerator = @.preTranslateAccelerator = function(msg){ \n	__/*返回是否快捷键\n在 translateAccelerator 之前执行,仅适用于窗体不适用于控件\n当前窗口以及子窗口上的按键都会触发此事件\nwin.ui.accelerator 绑定窗体时将自动添加该事件*/\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(.(等待函数,超时,延时间隔) = 循环执行等待函数,并等待返回值\n直到等待函数返回非空值,或存在第二个返回值,或当前窗口关闭\n等待函数返回的值就是wait函数的返回值,\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.setIcon(.(小图标,大图标) = 修改窗口图标,\n参数可选指定图标句柄、或者图标路径、内存数据等,\n窗口和任务栏显示小图标,ALT+TAB显示大图标,\n指定其中一个图标,另一个会设为相同图标,\n返回窗口之前的小图标和大图标,如果之前无对应图标则返回null
!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    __/*窗口背景重绘完成触发此事件*/\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	{__/*在这里指定要遍历处理每个元素的数组或表,\n并在回调函数中返回每次需要间隔的延时,以毫秒为单位,返回0或空值中断处理,\n回调参数为下一个元素的值和索引,处理完后回调参数为null,\n如果此时未返回null或0退出处理函数,将返回第一个元素继续遍历*/},\n	function(value,index){\n		if(value){\n			return 50\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}
!nmdr.hwndFrom = 来源句柄
!nmdr.idFrom = 来源ID
!nmdr.code = 通知码
?win.ui.NMHDR = !nmdr.
end intellisense***/