# win.ui.ctrl.edit 库模块帮助文档

<details>  <summary>必读文档</summary>  <p>

## 字符计数规则

虽然控件的 text 属性返回的是 UTF-8 编码的文本。
但窗口控件内部以 UTF-16 编码处理文本，需要以代理对编码的字符会计为 2 个字符单位。
edit,richedit 的所有与字符位置有关的方法、属性、参数都按 UTF-16 编码计算字符位置。
例如 getSel,setSel 方法，caretPos 属性等。

实际上获取所有窗口控件文本的 win.getText 函数也是按 UTF-16 编码规则计算字符长度与位置。

aardio 的 string.slice,string.left,string.right 等字符串函数
在指定以字符单位计数时是按 UTF-8 编码规则计数，多字节字符总是计为 1 个单位。
请注意与 edit,richedit 等返回的 UTF-16 编码的字符位置进行区别。

需要以代理对表示的字符并不多见，如果文本不包含代理对编码，
则 UTF-8 或 UTF-16 编码计算的字符数与字符位置是等价的。

## 文本框、富文本框的不同换行规则

在窗口程序中，要注意以下规则：

- 文本框（win.ui.ctrl.edit）始终必须以 `'\r\n'` 换行，
并在计算选区时将 `'\r\n'`  计为两个字符单位。
如果传入文本为单个 `'\n'` 换行则在 edit 控件内不会显示为有效换行。

- 无论输入文本使用回车换行（ `'\r\n'` ）还是单个 `'\n'` 换行，
富文本框（win.ui.ctrl.richedit） 都会将文本转换为规范化为以  `'\r\n'` 换行，
并在渲染和计算选区时将 `'\r\n'` 视为单个 `'\n'` 换行。

edit 控件的 `getLength()` 方法返回的长度将有效换行计为 2 个单位（`'\r\n'` ）。
richedit 控件的 `getLength()` 方法默认将换行计为 1 个单位（`'\n'` ） 。

另外，richedit 控件可使用 `getLength(true)` 返回将换行计为 2 个单位的字符计数长度。
而且 richedit 控件额外提供 `getLengthEx(flags)` 方法（基于 `0x45F/*_EM_GETTEXTLENGTHEX*/` 消息）。

</p></details>

## win.ui.ctrl 成员列表 <a id="win.ui.ctrl" href="#win.ui.ctrl">&#x23;</a>

### win.ui.ctrl.edit <a id="win.ui.ctrl.edit" href="#win.ui.ctrl.edit">&#x23;</a>
文本框控件支持库

### win.ui.ctrl.edit() <a id="win.ui.ctrl.edit" href="#win.ui.ctrl.edit">&#x23;</a>
文本框控件  

[返回对象:editObject](#editObject)

## editObject 成员列表 <a id="editObject" href="#editObject">&#x23;</a>

### editObject._defWindowProc(hwnd,message,wParam,lParam) <a id="editObject._defWindowProc" href="#editObject._defWindowProc">&#x23;</a>
用于在 wndproc 回调中提前调用默认消息回调函数,  
所有窗口和控件定义了 wndproc 回调以后会自动创建这个函数,  
调用此函数以后,wndproc 必须指定非 null 返回值,  
以避免再次重复调用默认回调函数

### editObject._parentForm <a id="editObject._parentForm" href="#editObject._parentForm">&#x23;</a>
返回创建控件的容器窗口（win.form对象），所有窗口控件都拥有此只读属性。  
对于使用窗体设计器创建的窗口，也就是返回设计时窗体容器。  

即使子窗口移除子窗口样式、更改父子关系，或以 orphanWindow显示，  
控件的 _parentForm 始终都不会改变  

[返回对象:winform](https://www.aardio.com/zh-cn/doc/library-reference/win/ui/_.html#winform)

### editObject.addCtrl() <a id="editObject.addCtrl" href="#editObject.addCtrl">&#x23;</a>
[返回对象:staticObject](https://www.aardio.com/zh-cn/doc/library-reference/win/ui/ctrl/static.html#staticObject)

### editObject.addCtrl(controlsPropertiesTable) <a id="editObject.addCtrl" href="#editObject.addCtrl">&#x23;</a>

```aardio
editObject.addCtrl(  
	cls="spin";marginRight=2;marginTop=1;marginBottom=4;width=16;  
	oncommand = function(id,event,pos){   
		if( pos & event == 0x4/*_SB_THUMBPOSITION*/ ){  
 				winform.edit.text = string.format("%.2f",pos / 100 )  
		}  
	}  
)/*在 richedit 控件窗口内添加子窗口*/
```

### editObject.adjust <a id="editObject.adjust" href="#editObject.adjust">&#x23;</a>

```aardio
editObject.adjust = function( cx,cy,wParam ) {	   
	/*父窗口改变大小后会自动触发此事件函数。  
注意 onSize 是 adjust 事件的别名，作用相同。  
所有 win.form 创建的窗体和控件都支持 adjust 事件,  
重复赋值 adjust 会追加事件触发器而非替换原来的值。  

cx 参数为窗口客户区宽度,cy 参数为窗口客户区高度,  
wParam 参数来自 _WM_SIZE 消息的 wParam 参数，一般不用管。  
一般不建议添加一个 wndproc 仅仅是为了处理  _WM_SIZE 消息，  
定义 adjust 事件是更好的选择。  

如果主动调用此函数，则检查并执行所有之前添加的 adjust 事件函数。  
省略调用参数时 cx,cy 参数默认设为窗口大小*/    
};
```

### editObject.appendText <a id="editObject.appendText" href="#editObject.appendText">&#x23;</a>
追加文本并移动光标插入点到文本尾部。

### editObject.appendText(追加文本-..) <a id="editObject.appendText" href="#editObject.appendText">&#x23;</a>
追加文本并移动光标插入点到文本尾部。  
可指定零个、或多个参数，参数可以是字符串、buffer、数值。  
传入其他类型参数会抛出异常。  
返回文本总长度

### editObject.autoComplete <a id="editObject.autoComplete" href="#editObject.autoComplete">&#x23;</a>
启用自动完成功能。  
此函数仅适用于 edit 控件（单行模式），并不兼容 richedit 控件。

### editObject.autoComplete() <a id="editObject.autoComplete" href="#editObject.autoComplete">&#x23;</a>
[返回对象:ComAompleteObject](#ComAompleteObject)

### editObject.autoComplete(flags) <a id="editObject.autoComplete" href="#editObject.autoComplete">&#x23;</a>
启用自动完成功能（默认列表），返回 null 值。  
参数 @flags 可用数值指定选项（_SHACF_ 前缀自动完成常量）。  
省略则默认设为 为 `0x21/*_SHACF_FILESYS_DIRS | _SHACF_FILESYSTEM*/`  
以启用文件与目录路径的自动完成功能。  

如果参数指定了数值或 null 值，之后再指定字符串数组是无效的，  
反过来也是一样。

### editObject.autoComplete(strings) <a id="editObject.autoComplete" href="#editObject.autoComplete">&#x23;</a>
启用自动完成功能（用户自定义列表），返回 com.autoComplete 对象。  
参数 @strings 使用一个字符串数组自定义自动完成列表的数据。  
必须提前导入 com.autoComplete 库才能支持数组参数。

### editObject.bgcolor <a id="editObject.bgcolor" href="#editObject.bgcolor">&#x23;</a>
获取或修改景颜色数值

### editObject.bottom <a id="editObject.bottom" href="#editObject.bottom">&#x23;</a>
底部坐标

### editObject.canCopy() <a id="editObject.canCopy" href="#editObject.canCopy">&#x23;</a>
能否复制,  
实际上也就是判断是否存在选区

### editObject.canPaste() <a id="editObject.canPaste" href="#editObject.canPaste">&#x23;</a>
能否粘贴

### editObject.canRedo() <a id="editObject.canRedo" href="#editObject.canRedo">&#x23;</a>
能否重做

### editObject.canUndo() <a id="editObject.canUndo" href="#editObject.canUndo">&#x23;</a>
能否撤消

### editObject.capture <a id="editObject.capture" href="#editObject.capture">&#x23;</a>
是否捕获全局鼠标消息

### editObject.caretPos <a id="editObject.caretPos" href="#editObject.caretPos">&#x23;</a>
输入光标所在文本插入点位置，以字符为单位。  
此属性以 UTF-16 编码规则计算字符数，代理对计为 2 个单位。  

获取值时如果有选区则返回选区最后一个字符的位置，  

无选区则返回插入点前面的字符位置。  

仅在设置值时可以用负数则表示尾部倒计数，-1 表示文本尾部。  
> 调用 setSel 方法并指定单个参数改变光标位置时  
> 负数相对当前位置（当前光标位置大于 0）或文本尾部记数

### editObject.center(目标窗口) <a id="editObject.center" href="#editObject.center">&#x23;</a>
在目标窗口区域内居中，并调整以保证显示在父窗口或屏幕工作区内。  

参数 @1 可指定目标窗口或者目标窗口句柄，设为 0 表示桌面，  
省略目标窗口则默认取父窗口或所有者窗口。

### editObject.className <a id="editObject.className" href="#editObject.className">&#x23;</a>
运行时类名

### editObject.clear() <a id="editObject.clear" href="#editObject.clear">&#x23;</a>
清除选中文本

### editObject.clientHeight <a id="editObject.clientHeight" href="#editObject.clientHeight">&#x23;</a>
控件窗口客户区宽度，只读属性。

### editObject.clientWidth <a id="editObject.clientWidth" href="#editObject.clientWidth">&#x23;</a>
控件窗口客户区宽度，只读属性。

### editObject.close() <a id="editObject.close" href="#editObject.close">&#x23;</a>
关闭控件窗

### editObject.cls <a id="editObject.cls" href="#editObject.cls">&#x23;</a>
设计时类名

### editObject.color <a id="editObject.color" href="#editObject.color">&#x23;</a>
获取或修改字体颜色数值

### editObject.copy() <a id="editObject.copy" href="#editObject.copy">&#x23;</a>
复制

### editObject.cut() <a id="editObject.cut" href="#editObject.cut">&#x23;</a>
剪切

### editObject.deselect() <a id="editObject.deselect" href="#editObject.deselect">&#x23;</a>
取消选定

### editObject.disableInputMethod() <a id="editObject.disableInputMethod" href="#editObject.disableInputMethod">&#x23;</a>
在此控件中关闭输入法, 仅支持英文输入

### editObject.disabled <a id="editObject.disabled" href="#editObject.disabled">&#x23;</a>
控件时否禁用

### editObject.disabledText <a id="editObject.disabledText" href="#editObject.disabledText">&#x23;</a>
当指定文本时，禁用此控件并显示指定文本。  
指定为 null 时，启用此控件并恢复控件之前的正常文本。

### editObject.dump(变量) <a id="editObject.dump" href="#editObject.dump">&#x23;</a>
显示变量的值,支持多参数  
注意仅显示普通table,string,number等类型的值,不显示函数等

### editObject.enablePopMenu() <a id="editObject.enablePopMenu" href="#editObject.enablePopMenu">&#x23;</a>

```aardio
editObject.enablePopMenu(function(){  
	return {   
		{ /*分隔线*/ };   
		{ "自定义菜单项";  function(id){  
			/*enablePopMenu 用于启用文本框的右键菜单。  
可选指定要增加的菜单配置表（或返回菜单配置表的函数）作为参数。  
菜单配置表将作为参数传给 win.ui.popmenu 对象的 addTable 函数。  
格式请查看该函数说明函数。  
调用此函数必须事先引用 win.ui.menu 。*/  
		}; !owner.canCopy() ? 1/*_MF_GRAYED*/ : 0}; 	  
	}  
})
```

### editObject.font <a id="editObject.font" href="#editObject.font">&#x23;</a>
控件字体（LOGFONT 结构体），  
注意获取该属性总是返回新的 LOGFONT 对象，  
修改返回字体并不会更新控件字体，  
除非重新赋值。  

建议尽量优先使用 getFont 或 setFont 函数，  
以增强代码可读性  

字体会根据控件设置自动处理 DPI 缩放，不需要事先缩放字体大小

### editObject.getClientRect() <a id="editObject.getClientRect" href="#editObject.getClientRect">&#x23;</a>
控件文本客户区块位置(::RECT结构体)  

[返回对象:rectObject](https://www.aardio.com/zh-cn/doc/library-reference/global/_.html#rectObject)

### editObject.getFont() <a id="editObject.getFont" href="#editObject.getFont">&#x23;</a>
返回控件 LOGFONT 字体，  
返回对象的 h 值会按控件的 DPI 缩放设置自动还原为缩放前大小。  

[返回对象:logfontObject](#logfontObject)

### editObject.getFont(true) <a id="editObject.getFont" href="#editObject.getFont">&#x23;</a>
返回控件 LOGFONT 字体，  
返回对象的 h 值为字体实际大小，不会按控件 DPI 设置还原。  
返回字体会设置 noScale 属性为 true,  
使用控件的 setFont 函数或赋值 font 属性时，  
noScale 属性为 true 的字体同样不会进行自动 DPI 缩放  

[返回对象:logfontObject](#logfontObject)

### editObject.getLength() <a id="editObject.getLength" href="#editObject.getLength">&#x23;</a>
获取文本长度  
注意是按字符计数，而不是按字节计数

### editObject.getParent() <a id="editObject.getParent" href="#editObject.getParent">&#x23;</a>
返回父窗口  

[返回对象:staticObject](https://www.aardio.com/zh-cn/doc/library-reference/win/ui/ctrl/static.html#staticObject)

### editObject.getPos() <a id="editObject.getPos" href="#editObject.getPos">&#x23;</a>
返回相对坐标,宽,高  
x,y,cx,cy=win.getPos(hwnd)

### editObject.getRect() <a id="editObject.getRect" href="#editObject.getRect">&#x23;</a>
控件区块位置(::RECT结构体)

### editObject.getRect(true) <a id="editObject.getRect" href="#editObject.getRect">&#x23;</a>
控件屏幕区块位置(::RECT结构体)

### editObject.getRoot() <a id="editObject.getRoot" href="#editObject.getRoot">&#x23;</a>
获取顶层父窗口，这个函数会查找 orphanWindow 的父窗口

### editObject.getSel() <a id="editObject.getSel" href="#editObject.getSel">&#x23;</a>
获取选区起始位置,结束位置。  
选区包含起始与结束位置的字符，首字符位置为1  
开始位置在指定的字符前面,结束位置表示指定的字符后面  
只有一个返回值时表示无选区,并表示输入光标在指定字符后面  
返回0表示输入光标在最前面,并且无选区。  

此函数以 UTF-16 编码规则计算字符数，代理对计为 2 个单位。

### editObject.hScroll() <a id="editObject.hScroll" href="#editObject.hScroll">&#x23;</a>
滚动到右侧

### editObject.hScroll(_SB) <a id="editObject.hScroll" href="#editObject.hScroll">&#x23;</a>
滚动横向滚动条

### editObject.height <a id="editObject.height" href="#editObject.height">&#x23;</a>
高度

### editObject.hide <a id="editObject.hide" href="#editObject.hide">&#x23;</a>
当前控件窗口是否隐藏。  
仅检查当前窗口的可见性样式（窗口 是否移除了 _WS_VISIBLE 样式）。  
不考虑父窗口是否可见，不考虑是否被其他窗口遮挡。  
如果需要同时判断父窗口的可见性，应改用 win.isVisible 函数。  

以 `.` 前导的 `.hide()` 作为成员函数被调用时，  
作用等价于将 hide 属性设为 null 。

### editObject.hwnd <a id="editObject.hwnd" href="#editObject.hwnd">&#x23;</a>
控件句柄

### editObject.id <a id="editObject.id" href="#editObject.id">&#x23;</a>
控件ID

### editObject.inflateClientRect(dx,dy) <a id="editObject.inflateClientRect" href="#editObject.inflateClientRect">&#x23;</a>
正数增大,负数缩小文本客户区  
文本框必须在设计时指定为多行  
在文本框改变大小必须重新设置

### editObject.invalidate(/*可选使用::RECT()对象指定客户区*/) <a id="editObject.invalidate(/*可选使用::RECT" href="#editObject.invalidate(/*可选使用::RECT">&#x23;</a>
使窗口绘图区无效

### editObject.invalidate(/*可选使用::RECT()对象指定客户区*/,0) <a id="editObject.invalidate(/*可选使用::RECT" href="#editObject.invalidate(/*可选使用::RECT">&#x23;</a>
使窗口绘图区无效  
不刷新背景

### editObject.isDialogMessage <a id="editObject.isDialogMessage" href="#editObject.isDialogMessage">&#x23;</a>

```aardio
editObject.isDialogMessage = function(hParent,msg){/*在控件范围内替代父窗口的 isDialogMessage，  
可用于在控件范围内屏蔽对话框快捷键。  
可用于禁用 tab 控制键的多行文本框支持按 tab 输入制表符*/}
```

### editObject.left <a id="editObject.left" href="#editObject.left">&#x23;</a>
左侧坐标

### editObject.leftText() <a id="editObject.leftText" href="#editObject.leftText">&#x23;</a>
获取参数 @1 指定位置之前的文本，  
以字符为单位，负数自右侧倒计数。  
不指定参数获取输和光标所在插入点之前的文本。

### editObject.limit <a id="editObject.limit" href="#editObject.limit">&#x23;</a>
字符数限制,注意不是以字节为单位,  
此限制主要用于限制用户输入,对读写text属性无效,  
如果设为0，单行文本框指定为0x7FFFFFFE，多行文本框指定为-1  
如果用于限制log,print等函数输出字符数时,值不能设置过大或设为0、负数等

### editObject.lineCount <a id="editObject.lineCount" href="#editObject.lineCount">&#x23;</a>
获取行数

### editObject.lineFromChar() <a id="editObject.lineFromChar" href="#editObject.lineFromChar">&#x23;</a>
不指定参数则返回当前行

### editObject.lineFromChar(指定位置) <a id="editObject.lineFromChar" href="#editObject.lineFromChar">&#x23;</a>
返回指定位置行数

### editObject.lineLength(指定行号) <a id="editObject.lineLength" href="#editObject.lineLength">&#x23;</a>
返回指定行字符数  
省略参数表示当前行,小于0表示自尾部倒数到指定行,-1表示最后一行

### editObject.lineRange(行号) <a id="editObject.lineRange" href="#editObject.lineRange">&#x23;</a>
返回指定行的开始位置与结束位置。  
参数 @1 指定行号，起始行号为 1，可用 -1 表示最后一行。

### editObject.lineScroll(滚动行数) <a id="editObject.lineScroll" href="#editObject.lineScroll">&#x23;</a>
滚动条垂直滚动指定行数。  
如果不指定参数则滚动到最后一行

### editObject.lineText(指定行号) <a id="editObject.lineText" href="#editObject.lineText">&#x23;</a>
获取指定行文本  
错误行号返回null空值  
省略参数表示当前行,小于0表示自尾部倒数到指定行,-1表示最后一行

### editObject.lineToChar() <a id="editObject.lineToChar" href="#editObject.lineToChar">&#x23;</a>
获取当前选定行首字符位置

### editObject.lineToChar(指定行号) <a id="editObject.lineToChar" href="#editObject.lineToChar">&#x23;</a>
获取指定行首字符位置。  
省略参数表示当前行,小于0表示自尾部倒数到指定行,-1表示最后一行

### editObject.lines(忽略空白) <a id="editObject.lines" href="#editObject.lines">&#x23;</a>

```aardio
for line in editObject.lines(true){ 
	/*遍历所有文本行,  
如果迭代器参数为true则清除每行首尾空格,并忽略空行*/
}
```

### editObject.load() <a id="editObject.load" href="#editObject.load">&#x23;</a>
自参数 @1 指定的文件路径加载文本。

### editObject.log( ,'\r\n' ) <a id="editObject.log" href="#editObject.log">&#x23;</a>
追加字符串到文本框,可输入多个参数  
如果超出limit属性设定的字符数限制则移除头部多余的字符  
为提升性能,limit不可过大

### editObject.modified <a id="editObject.modified" href="#editObject.modified">&#x23;</a>
用户手动输入会修改此属性。  
调用 selText,appendText,appendLink 等模拟用户输入文本的函数会变更此属性为 true 。  
调用 load,save 会重置此属性为 false 。  

修改 text 属性、以及调用 log,print 等函数不会自动变更此属性。  
onChange 事件可使用此属性区分是否用户修改导致的变更。

### editObject.modifyStyle(remove,add,swpFlags) <a id="editObject.modifyStyle" href="#editObject.modifyStyle">&#x23;</a>
修改窗口样式,所有参数都是可选参数,  
@remove 用数值指定要移除的样式,可使用 _WS_ 前缀的常量  
@add 用数值指定要添加的样式,可使用 _WS_ 前缀的常量  
@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量  
如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos  
细节请参考 win.modifyStyle 函数源码

### editObject.modifyStyleEx(remove,add,swpFlags) <a id="editObject.modifyStyleEx" href="#editObject.modifyStyleEx">&#x23;</a>
修改窗口扩展样式,所有参数都是可选参数,  
@remove 用数值指定要移除的样式,可使用 _WS_EX_ 前缀的常量  
@add 用数值指定要添加的样式,可使用 _WS_EX_ 前缀的常量  
@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量  
如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos  
细节请参考 win.modifyStyle 函数源码

### editObject.orphanWindow(transparent,hwndBuddy,borderless) <a id="editObject.orphanWindow" href="#editObject.orphanWindow">&#x23;</a>
创建悬浮窗口。  
悬浮窗口是模仿子窗口外观效果的独立窗口，父窗口可自动调整子窗口到设定位置。  
可选参数 @transparent 为 true 则转换为分层透明窗口。  
可选利用 @hwndBuddy 参数指定外部进程窗口句柄的并附加在内部控件上以实现相同的效果。  
伙伴窗口总是会保持在悬浮窗口前面，并保持相同的大小、位置。  
可重复调用此函数更换伙伴窗口，旧的伙伴窗口必须自行关闭。  
可选指定 @borderless 参数 为 true 以移除 @hwndBuddy  的窗口边框。

### editObject.padding <a id="editObject.padding" href="#editObject.padding">&#x23;</a>
文本边距  
应通过 setPadding 函数设置该值

### editObject.passwordChar <a id="editObject.passwordChar" href="#editObject.passwordChar">&#x23;</a>
单行文本框可用此属性指定隐藏密码的占位字符，不适用于多行文本框。  
即使在创建控件时未启用密码样式此属性同样有效。  
例如指定为`*`则所有输入字符显示星号,指定为 null 正常显示文本

### editObject.paste() <a id="editObject.paste" href="#editObject.paste">&#x23;</a>
粘贴

### editObject.postMessage(msg,wParam,lParam) <a id="editObject.postMessage" href="#editObject.postMessage">&#x23;</a>
投递窗口消息到消息队列中  
此函数用法请参考 ::User32.PostMessage

### editObject.preadjust <a id="editObject.preadjust" href="#editObject.preadjust">&#x23;</a>

```aardio
editObject.preadjust = function( cx,cy,wParam ) {	   
	/*窗口缩放后重绘前、触发 adjust 事件之前触发此事件。  
所有 win.form 创建的窗体和控件都支持此事件,  
与 adjust 事件不同，对 preadjust 重复赋值则覆盖而不是追加事件。   

cx 参数为窗口宽度,cy 参数为窗口高度,  
wParam 为 _WM_SIZE 消息参数。*/    
};
```

### editObject.print(...) <a id="editObject.print" href="#editObject.print">&#x23;</a>
将多个参数转换为字符串,  
并使用制表符分隔各参数追加到文本尾部  
并追加换行  
如果超出limit属性设定的字符数限制则移除头部多余的字符。  
为提升性能,limit 不可过大。  

对于 table 对象,aardio 会将其序列化为文本然后输出,  
如果当前已经导入了 JSON 库，则 table 对象自动转换为 JSON 后输出，  
可以用于调试代码显示变量的值。

### editObject.printf(...) <a id="editObject.printf" href="#editObject.printf">&#x23;</a>
将多个参数调用string.format格式化后追加到文本尾部  
并追加换行

### editObject.publish("字符串参数",) <a id="editObject.publish" href="#editObject.publish">&#x23;</a>
在窗口所在界面线程发布消息,  
运行界面线程所有所有调用subscribe函数订阅此消息的函数,  
可添加任意个触发参数

### editObject.readonly <a id="editObject.readonly" href="#editObject.readonly">&#x23;</a>
是否只读  
只读时禁止编辑

### editObject.redo() <a id="editObject.redo" href="#editObject.redo">&#x23;</a>
重做

### editObject.redraw() <a id="editObject.redraw" href="#editObject.redraw">&#x23;</a>
刷新

### editObject.reloadScale() <a id="editObject.reloadScale" href="#editObject.reloadScale">&#x23;</a>
按设计时位置参数、重新调整控件位置以适应窗口当前缩放比例。  
父窗口缩放时会自动执行此操作。  
默认在启动窗口消息循环时会自适应调整所有控件。  
所以在启动消息循环前添加控件不必调用此函数。

### editObject.resize(宽度,高度) <a id="editObject.resize" href="#editObject.resize">&#x23;</a>
如果指定了参数则调整窗口大小,  
无论是否实际调整窗口大小,发送 _WM_SIZE 消息给窗口

### editObject.right <a id="editObject.right" href="#editObject.right">&#x23;</a>
右侧坐标

### editObject.rightText() <a id="editObject.rightText" href="#editObject.rightText">&#x23;</a>
自文本尾部获取参数 @1 指定字符个数的文本，  
负数自左侧倒计数，以字符为单位。  
不指定参数获取输入光标所在插入点之后的文本。

### editObject.save() <a id="editObject.save" href="#editObject.save">&#x23;</a>
保存控件文本到参数 @1 指定的文件路径。

### editObject.saveScale() <a id="editObject.saveScale" href="#editObject.saveScale">&#x23;</a>
根据控件当前位置、缩放比例，更新控件的设计时位置参数。  
以避免下次窗口缩放自适应调整控件当前位置更改被清除，  
控件所有调整位置的属性或成员函数已自动调用此函数。

### editObject.scroll(cmd,pos,msg) <a id="editObject.scroll" href="#editObject.scroll">&#x23;</a>
发送滚动消息 。  
参数 @cmd 用数值指定滚动命令，例如 `7/*_SB_BOTTOM*/`, `6/*_SB_TOP*/`等。  
如果参数 @cmd 指定 `4/*_SB_THUMBPOSITION*/` 则可用参数 @pos 指定滚动条的位置（数值）。  
默认发送 _WM_VSCROLL 消息，可选用参数 @msg 指定消息 ID 为 `0x114/*_WM_HSCROLL*/` 。  
这是所有窗口与控件都继承的公共方法。

### editObject.scrollCaret() <a id="editObject.scrollCaret" href="#editObject.scrollCaret">&#x23;</a>
滚动到输入光标处，可选用一个数值参数指定新的输入光标位置。

### editObject.scrollToLine(指定行) <a id="editObject.scrollToLine" href="#editObject.scrollToLine">&#x23;</a>
将光标移动到指定行，并滚动到该行。

### editObject.selLine <a id="editObject.selLine" href="#editObject.selLine">&#x23;</a>
获取或设置当前行,  
光标移动到该行开始处,并且滚动到该行,  
设为-1跳转到最后一行

### editObject.selText <a id="editObject.selText" href="#editObject.selText">&#x23;</a>
获取或替换选区文本。  
指定 null 值设为空字符串，其他类型转为字符串写入。

### editObject.selectAll() <a id="editObject.selectAll" href="#editObject.selectAll">&#x23;</a>
全选

### editObject.selectLine(line,text) <a id="editObject.selectLine" href="#editObject.selectLine">&#x23;</a>
选中整行。  
空行忽略。  

- 参数 @line 指定行号，起始行号为 1，可用 -1 表示最后一行。  
可选用参数 @text 指定选中行的文本内容（替换该行原来的文本）

### editObject.sendMessage(msg,wParam,lParam) <a id="editObject.sendMessage" href="#editObject.sendMessage">&#x23;</a>
发送窗口消息  
此函数用法请参考 ::User32.SendMessage

### editObject.setClientRect(RECT区块) <a id="editObject.setClientRect" href="#editObject.setClientRect">&#x23;</a>
参数为指定文本客户区的RECT结构体  
文本框必须在设计时指定为多行  
在文本框改变大小必须重新设置

### editObject.setCueBannerText <a id="editObject.setCueBannerText" href="#editObject.setCueBannerText">&#x23;</a>
指定单行文本框文本为空时的显示的默认提示文本

### editObject.setCueBannerText("提示文本",是否一直显示) <a id="editObject.setCueBannerText" href="#editObject.setCueBannerText">&#x23;</a>
指定单行文本框默认提示文本。  
参数 @1 必须是字符串，  
参数 @2 可省略，默认仅失去焦点时显示。  

XP 系统不支持此函数、但调用不报错。  
注意 plus 控件提供支持XP系统的 setCueBannerText 函数

### editObject.setFocus <a id="editObject.setFocus" href="#editObject.setFocus">&#x23;</a>
设置焦点。  
可选指定输入光标位置或选区参数（同时会自动滚动到光标所在位置）。

### editObject.setFocus() <a id="editObject.setFocus" href="#editObject.setFocus">&#x23;</a>
设置焦点，并将并将输入光标移动移动到文本框尾部

### editObject.setFocus(0) <a id="editObject.setFocus" href="#editObject.setFocus">&#x23;</a>
指定单个数值参数时，设置焦点并将输入光标移动到到文本框的指定位置。  
正数自文本开始位置计数，负数自尾部到计数。  
0 为文本开始位置，-1 为文本尾部，-2 表示倒数第 2 个字符之后。

### editObject.setFocus(0,-1) <a id="editObject.setFocus" href="#editObject.setFocus">&#x23;</a>
指定 2 个数值参数时表示在设置焦点后改变选区。  
参数用法与 selSel 方法完全相同，参数 1 表示开始位置，参数 2 表示结束位置。  
指定 2 个参数时仅 -1 表示文本尾部，不支持其他负数。

### editObject.setFocus(false) <a id="editObject.setFocus" href="#editObject.setFocus">&#x23;</a>
仅设置焦点，不改变光标位置或选区

### editObject.setFont(指定字体) <a id="editObject.setFont" href="#editObject.setFont">&#x23;</a>
指定 LOGFONT 字体对象,或逻辑字体句柄  
如果不指定 point 值并指定 h 值，字体会按控件的 DPI 缩放设置自动缩放。

### editObject.setFont(混入字体属性) <a id="editObject.setFont" href="#editObject.setFont">&#x23;</a>

```aardio
editObject.setFont(h=-12;name="Tahoma");
```

### editObject.setPadding(上,右,下,左) <a id="editObject.setPadding" href="#editObject.setPadding">&#x23;</a>
设置文本边距，所有参数都可以省略。  
文本框必须在设计时指定为多行，  
在文本框改变大小后仍然可以保持此边距。  

边距默认应设置缩放前的原始值  
如果参数为 @5 为 true 则边距应为当前 DPI 缩放后的值

### editObject.setParent(控件对象) <a id="editObject.setParent" href="#editObject.setParent">&#x23;</a>
改变父窗口

### editObject.setPos(x坐标,y坐标,宽,高,插入位置,参数) <a id="editObject.setPos" href="#editObject.setPos">&#x23;</a>
调整窗口位置或排序,所有参数可选  
同时指定x,y坐标则移动位置  
同时指定宽高则改变大小  
指定插入位置(句柄或_HWND前缀常量)则调整Z序

### editObject.setRect(rc) <a id="editObject.setRect" href="#editObject.setRect">&#x23;</a>
设置控件区块位置(::RECT结构体)

### editObject.setRect(rc,true) <a id="editObject.setRect" href="#editObject.setRect">&#x23;</a>
设置控件屏幕区块位置(::RECT结构体)

### editObject.setRedraw(false) <a id="editObject.setRedraw" href="#editObject.setRedraw">&#x23;</a>
禁止重绘

### editObject.setRedraw(true) <a id="editObject.setRedraw" href="#editObject.setRedraw">&#x23;</a>
恢复重绘

### editObject.setSel <a id="editObject.setSel" href="#editObject.setSel">&#x23;</a>
设置选区，选区包含起始与结束位置。  

此函数以 UTF-16 编码规则计算字符数，代理对计为 2 个单位。

### editObject.setSel(光标位置) <a id="editObject.setSel" href="#editObject.setSel">&#x23;</a>
单参数表示移动输入光标到指定位置的字符后面，无选区。  
0 表示文本开始（第 1 个字符之前）,1 表示第 1 个字符的后面。  
可用负数表示相对于当前光标位置或者文本尾部倒计数位置。  
如果当前光标位置大于 0，则 -1 表示当前光标位置，否则表示文本尾部。  
-2 则表示 -1 所在位置倒数移动 1 个字符。  
这种负数表示法仅在指定单个参数时有效。  

也可以使用 caretPos 属性改变输入光标位置（负数总是表示文本尾部倒计数位置）。

### editObject.setSel(起始位置,结束位置) <a id="editObject.setSel" href="#editObject.setSel">&#x23;</a>
如果结束位置小于开始位置则自动交换参数位置。  

位置参数以字符为单位，1 为首字符。  
计算选区时 edit 控件控件将回车换行（ CRLF `'\r\n'` ） 计为两个字符单位。  
richedit 控件将回车换行（ CRLF ）计为一个字符单位  
结束位置可以用 -1 表示文本尾部，不支持其他负数。

### editObject.show(true) <a id="editObject.show" href="#editObject.show">&#x23;</a>
显示控件

### editObject.showBalloonTip <a id="editObject.showBalloonTip" href="#editObject.showBalloonTip">&#x23;</a>
显示气泡提示,  
建议直接调用showInfoTip，showWarningTip 或 showErrorTip

### editObject.showBalloonTip(text) <a id="editObject.showBalloonTip" href="#editObject.showBalloonTip">&#x23;</a>
在输入光标处显示汽泡提示,  
@text参数指定文本

### editObject.showBalloonTip(title,text,icon) <a id="editObject.showBalloonTip" href="#editObject.showBalloonTip">&#x23;</a>
在输入光标处显示汽泡提示,  
@title参数指定标题,  
@text参数指定文本,  
icon指定图标句柄，可省略

### editObject.showErrorTip <a id="editObject.showErrorTip" href="#editObject.showErrorTip">&#x23;</a>
在输入光标处显示汽泡提示,使用错误图标

### editObject.showErrorTip(text) <a id="editObject.showErrorTip" href="#editObject.showErrorTip">&#x23;</a>
在输入光标处显示汽泡提示,使用错误图标,  
@text参数指定文本

### editObject.showErrorTip(title,text,large) <a id="editObject.showErrorTip" href="#editObject.showErrorTip">&#x23;</a>
在输入光标处显示汽泡提示,使用错误图标,  
@title参数指定标题,  
@text参数指定文本,  
large指定是否使用大图标，可省略

### editObject.showInfoTip <a id="editObject.showInfoTip" href="#editObject.showInfoTip">&#x23;</a>
在输入光标处显示汽泡提示

### editObject.showInfoTip(text) <a id="editObject.showInfoTip" href="#editObject.showInfoTip">&#x23;</a>
在输入光标处显示汽泡提示,使用提示信息图标,  
@text参数指定文本

### editObject.showInfoTip(title,text,large) <a id="editObject.showInfoTip" href="#editObject.showInfoTip">&#x23;</a>
在输入光标处显示汽泡提示,使用提示信息图标,  
@title参数指定标题,  
@text参数指定文本,  
large指定是否使用大图标，可省略

### editObject.showWarningTip <a id="editObject.showWarningTip" href="#editObject.showWarningTip">&#x23;</a>
在输入光标处显示汽泡提示,使用警告图标

### editObject.showWarningTip(text) <a id="editObject.showWarningTip" href="#editObject.showWarningTip">&#x23;</a>
在输入光标处显示汽泡提示,使用警告图标,  
@text参数指定文本

### editObject.showWarningTip(title,text,large) <a id="editObject.showWarningTip" href="#editObject.showWarningTip">&#x23;</a>
在输入光标处显示汽泡提示,使用警告图标,  
@title参数指定标题,  
@text参数指定文本,  
large指定是否使用大图标，可省略

### editObject.sliceText(startIndex,endIndex) <a id="editObject.sliceText" href="#editObject.sliceText">&#x23;</a>
获取指定字符范围的文本。  
- 参数 @startIndex 指定开始位置。  
-参数 @endIndex 指定结束位置。  

1 表示第 1 个字符，按 UTF-16 编码规则计算字符数。

### editObject.tabNext() <a id="editObject.tabNext" href="#editObject.tabNext">&#x23;</a>
[返回对象:staticObject](https://www.aardio.com/zh-cn/doc/library-reference/win/ui/ctrl/static.html#staticObject)

### editObject.tabNext(移动焦点,是否反向) <a id="editObject.tabNext" href="#editObject.tabNext">&#x23;</a>
获取下一个支持tab控制焦点的控件  
参数@1为true会自动移动焦点到该控件  
参数@2为true则获取上一个控件,否则获取下一个控件

### editObject.text <a id="editObject.text" href="#editObject.text">&#x23;</a>
获取或写入编辑控件文本属性。  
可写入 UTF8 或 UTF16 字符串，写入 null 值转换为空字符串（""），  
其他类型值自动调用 tostring 转为字符串后写入。  

edit 或 richedit 控件的文本属性（text）都以回车换行（CRLF `'\r\n'`）表示换行。  
edit 控件不显示输入文本中缺少回车的单个换行符（`'\n'`），但 richedit 将其转换为回车换行（`'\r\n'`）。  
注意双引号或反引号包围的原样字符串会将源码中的回车换行解析为`'\n'`,  
而块注释赋值为原样字符串时会将源码中的单换行解析为`'\r\n'`。  

在计算选区时 edit 将 CRLF 计为两个字符单位，richedit 将 CRLF 计为一个字符单位。

### editObject.theme <a id="editObject.theme" href="#editObject.theme">&#x23;</a>
外观主题,例如  
winform.button.theme = "Explorer"  
winform.button.theme = false

### editObject.threadCallable() <a id="editObject.threadCallable" href="#editObject.threadCallable">&#x23;</a>
开启此控件的跨线程调用功能

### editObject.top <a id="editObject.top" href="#editObject.top">&#x23;</a>
顶部坐标

### editObject.translateAccelerator(msg) <a id="editObject.translateAccelerator" href="#editObject.translateAccelerator">&#x23;</a>

```aardio
editObject.translateAccelerator = function(msg){ 
    var vk = msg.wParam;
 	if( (vk == 0x9/*_VK_TAB*/ ) || (vk = 0xD/*_VK_RETURN*/) ){
		if( msg.message == 0x100/*_WM_KEYDOWN*/) {
			owner.tabNext(true); 
			return true;/*在此事件中可拦截键盘消息并自定义快捷键  
tabNext函数切换到下一个支持tab控制键的控件  
如果这是一个快捷键返回true以取消该消息的默认行为*/
		}
	}	
}
```

### editObject.translateCommand() <a id="editObject.translateCommand" href="#editObject.translateCommand">&#x23;</a>
允许转发转发子窗口的命令（_WM_COMMAND）与通知（_WM_NOTIFY）消息，  
避免子窗口 oncommand，onnotify 等回调失效。  
同时会处理子窗口的 _WM_CTLCOLORSTATIC 等消息，  
以避免部分外观属性失效

### editObject.undo() <a id="editObject.undo" href="#editObject.undo">&#x23;</a>
撤消

### editObject.update() <a id="editObject.update" href="#editObject.update">&#x23;</a>
重绘invalidate函数指定的区块

### editObject.updateLastLine() <a id="editObject.updateLastLine" href="#editObject.updateLastLine">&#x23;</a>
原地更新最后一行的文本（如果不是首行则忽略尾部空行），  
并将光标移到到该行行尾。  

参数 @1 指定字符串，指定多个参数则用 string.format 格式化。

### editObject.vScroll() <a id="editObject.vScroll" href="#editObject.vScroll">&#x23;</a>
滚动到底部

### editObject.vScroll(_SB) <a id="editObject.vScroll" href="#editObject.vScroll">&#x23;</a>
滚动竖向滚动条

### editObject.valid <a id="editObject.valid" href="#editObject.valid">&#x23;</a>
窗口是否有效，  
窗口未关闭返回 true ，  
窗口已关闭或正在关闭返回 false

### editObject.validateText <a id="editObject.validateText" href="#editObject.validateText">&#x23;</a>
校验输入文本。  
全部文本完全符合要求返回 true，否则返回 false。  

可在 onChange 事件内调用此函数实时校验输入。  

如果需要限制数字，  
更简单的方法是在窗体设计器中设置控件的『限制数字』属性为 true，  
也就是指定控件的创建参数 num 的值为 true。

### editObject.validateText(校验输入函数,错误信息) <a id="editObject.validateText" href="#editObject.validateText">&#x23;</a>
调用参数 @1 指定的函数校验控件的文本属性，  
该函数必须自参数中接收当前文本并返回合法文本或 null。  
然后将文本设为符合合法的文本，如果校验函数返回 null 设为空字符串。  

如果修改了文本且指定了字符串参数 @2 ，则在控件内用气泡提示显示参数 @2 指定的错误信息，  
并且将焦点切换到该控件，然后将输入光标设置到文本尾部。

### editObject.validateText(模式串,错误信息) <a id="editObject.validateText" href="#editObject.validateText">&#x23;</a>
用字符串参数 @1 指定的模式串校验控件的文本属性。  
将文本设为符合匹配的文本，如果找不到匹配文本设为空字符串。  

如果修改了文本且指定了字符串参数 @2 ，  
则在控件内用气泡提示显示参数 @2 指定的错误信息，  
并且将焦点切换到该控件，然后将输入光标设置到文本尾部。

### editObject.validateText(模式串,错误标题,错误信息) <a id="editObject.validateText" href="#editObject.validateText">&#x23;</a>
用字符串参数 @1 指定的模式串校验控件的文本属性。  
将文本设为符合匹配的文本，如果找不到匹配文本设为空字符串。  

如果修改了文本且指定了字符串参数 @2,@3 ，  
则在控件内用气泡提示显示参数 @2,@3 指定的错误信息，  
并且将焦点切换到该控件，然后将输入光标设置到文本尾部。

### editObject.validateText(限制金额示例,错误标题,错误信息) <a id="editObject.validateText" href="#editObject.validateText">&#x23;</a>

```aardio
editObject.validateText("<\d+\.\d\d>|<\d+\.\d>|<\d+\.>|<\d+>",  
	"不能接受的字符","只能在此输入金额，小数点后不能超过 2 位!")
```

### editObject.value <a id="editObject.value" href="#editObject.value">&#x23;</a>
控件文本，text 属性的别名。

### editObject.width <a id="editObject.width" href="#editObject.width">&#x23;</a>
宽度

### editObject.wrap <a id="editObject.wrap" href="#editObject.wrap">&#x23;</a>
是否启用自动换行,仅 richedit 支持

## editObject 事件列表 <a id="editObjectEvent" href="#editObjectEvent">&#x23;</a>

### editObject.onCancel() <a id="editObject.onCancel" href="#editObject.onCancel">&#x23;</a>

```aardio
editObject.onCancel = function(){ 
	/*当前已按下ESC,返回true阻止默认事件*/
	return true; 	
}
```

### editObject.onChange() <a id="editObject.onChange" href="#editObject.onChange">&#x23;</a>

```aardio
editObject.onChange = function(){ 

	if(!owner.modified) return; //只有用户输入导致更改时 modified 才会是 true

	owner.validateText("<\d+\.\d\d>|<\d+\.\d>|<\d+\.>|<\d+>"
		,"请输入金额，小数点后不能超过 2 位!"); 

	/*响应事件，文本内容已变更，  
edit 控件启用多行时用 text 属性赋值文本不会触发此事件，  
设为单行 edit 修改 text 属性可触发此事件（使用 modified 属性区分）。  
log,print 函数调用也是基于修改 text 属性实现，也不会触发此事件。  
但 appendText,selText 修改插入点文本的调用会触发此事件。*/
}
```

### editObject.onFocusGot() <a id="editObject.onFocusGot" href="#editObject.onFocusGot">&#x23;</a>

```aardio
editObject.onFocusGot = function(){ 
	/*响应事件，文本框已获得输入焦点*/
}
```

### editObject.onFocusLost() <a id="editObject.onFocusLost" href="#editObject.onFocusLost">&#x23;</a>

```aardio
editObject.onFocusLost = function(){
	/*响应事件，文本框已失去输入焦点*/
}
```

### editObject.onOk() <a id="editObject.onOk" href="#editObject.onOk">&#x23;</a>

```aardio
editObject.onOk = function(ctrl,alt,shift){ 
	/*在编辑框内按下回车触发此事件，返回 true 阻止默认事件。  
回调参数分别表示对应按钮是否已同时按下。*/
	return true;  	
}
```

### editObject.onSize <a id="editObject.onSize" href="#editObject.onSize">&#x23;</a>

```aardio
editObject.onSize = function( width,height,wParam ) {	   
	/*父窗口改变大小后会自动触发此事件函数。  
注意 onSize 是 adjust 事件的别名，作用相同  
所有 win.form 创建的窗体和控件都支持 onSize（或 adjust）事件,  
重复赋值 onSize（或 adjust）会追加事件触发器而非替换原来的值。  

width 参数为窗口客户区宽度,height 参数为窗口客户区高度,  
wParam 参数来自 _WM_SIZE 消息的 wParam 参数，一般不用管。  
一般不建议添加一个 wndproc 仅仅是为了处理  _WM_SIZE 消息，  
定义 onSize 事件是更好的选择。  

};*/
```

