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