//ipaddress IP地址控件 namespace win.ui.ctrl; import win.ui.ctrl.metaProperty; class ipaddress{ ctor(parent,tParam){ if( tParam ){ tParam.cls = "SysIPAddress32"; if(tParam.edge) tParam.exstyle |= 0x200/*_WS_EX_CLIENTEDGE*/; if(!tParam.font) { tParam.font = ::LOGFONT(); } if( tParam.bottom && parent && !(..win.ui.disableDpiScaling || parent.disableDpiScaling) ){ var scaleX,scaleY = ..gdi.getDpiScale(,parent.hwnd); if(scaleY>1){ tParam.font.h = tParam.font.h * scaleY; tParam.font.noScale = true; tParam.right = tParam.right + (50* scaleX); this[["(dpiTempWidth)"]] = (50* scaleX); tParam.bottom = tParam.bottom + (25* scaleY); this[["(dpiTempHeight)"]] = (25* scaleY); } } this.$text = tParam.text; } this._commandFuncnames ={[0x300/*_EN_CHANGE*/]="onChange";[0x100/*_EN_SETFOCUS*/] ="onFocusGot";[0x200/*_EN_KILLFOCUS*/]="onFocusLost"} } onCreated = function(){ if(this[["(dpiTempHeight)"]]){ this.height = this.height - this[["(dpiTempHeight)"]]; this[["(dpiTempHeight)"]] = false; this.width = this.width - this[["(dpiTempWidth)"]]; this[["(dpiTempWidth)"]] = false; } if(this.$text){ this.text = this.$text; this.$text = null; } } @_metaProperty; } namespace ipaddress{ _metaProperty = ..win.ui.ctrl.metaProperty( setRange = function(ip1,ip2){ if( type(ip1) == type.string ) ip1 = ..string.split(ip1,"."); if( type(ip2) == type.string ) ip2 = ..string.split(ip2,"."); if( ( ( type(ip1) != type.table ) || ( #ip1 != 4 ) ) || ( #ip2 != 4 ) ){ error("IP必须是四组数值",2) } for(i=1;4 ){ ::SendMessageInt(owner.hwnd,0x400/*_WM_USER*/ + 103,i-1,::MAKEWORD(tonumber(ip1[i],10),tonumber(ip2[i],10) ) ); } } address = { _get = function(){ var ret,_,ip = ::SendMessageByInt(owner.hwnd, 0x400/*_WM_USER*/ + 102, 0,0); return ip; } _set = function( ip ){ if(ip===null) ::SendMessageInt(owner.hwnd,0x400/*_WM_USER*/ + 100,0,0) else ::SendMessageInt(owner.hwnd,0x400/*_WM_USER*/ + 101,0,ip) } }; _prenotify = { [0xFFFFFCA4] = function(id,code,ptr,nmhdr){ if( owner.onFieldChanged ){ var nm = ..raw.convert(ptr,{ struct hdr = ::NMHDR(); int field; int value; }); owner.onFieldChanged(nm.field+1,nm.value); } } } ); } /***intellisense() win.ui.ctrl.ipaddress() = IP地址控件\n!SysIPAddress. !SysIPAddress.cls = 设计时类名 !SysIPAddress.className = 运行时类名 !SysIPAddress.clear() = 清除列表框所有内容 !SysIPAddress.hwnd = 控件句柄 !SysIPAddress.id = 控件ID !SysIPAddress._parentForm = 返回创建控件的容器窗口(win.form对象),所有窗口控件都拥有此只读属性。\n对于使用窗体设计器创建的窗口,也就是返回设计时窗体容器。\n\n即使子窗口移除子窗口样式、更改父子关系,或以 orphanWindow显示,\n控件的 _parentForm 始终都不会改变\n!winform. !SysIPAddress.getParent() = 返回父窗口\n!static. !SysIPAddress.setParent(__/*控件对象*/) = 改变父窗口 !SysIPAddress.addCtrl = @.addCtrl(\n\n edit ={ cls="edit";left=0;top=0;right=50;bottom=50;autoResize=false ;hide=1;edge=1; }\n) !SysIPAddress.disabled = 是否禁用 !SysIPAddress.left = 左侧坐标 !SysIPAddress.right = 右侧坐标 !SysIPAddress.top = 顶部坐标 !SysIPAddress.bottom = 底部坐标 !SysIPAddress.width = 宽度 !SysIPAddress.height = 高度 !SysIPAddress.show(true__) = 显示控件 !SysIPAddress.getRect() = 控件区块位置(::RECT结构体) !SysIPAddress.getRect(true) = 控件屏幕区块位置(::RECT结构体) !SysIPAddress.setRect(rc) = 设置控件区块位置(::RECT结构体) !SysIPAddress.setRect(rc,true) = 设置控件屏幕区块位置(::RECT结构体) !SysIPAddress.getClientRect() = 控件客户区块位置(::RECT结构体)\n!rect. !SysIPAddress.getFont() = 控件字体(::LOGFONT结构体)\n!logfont. !SysIPAddress.setFont(__/*指定字体*/) = 指定LOGFONT字体对象,或逻辑字体句柄 !SysIPAddress.setFont(混入字体属性) = @.setFont(point=10;name="宋体"); !SysIPAddress.clientRect = 获取控件客户区块位置(::RECT结构体) !SysIPAddress.theme = 外观主题,例如\nwinform.button.theme = "Explorer"\nwinform.button.theme = false !SysIPAddress.modifyStyle(.(remove,add,swpFlags) = 修改窗口样式,所有参数都是可选参数,\n@remove 用数值指定要移除的样式,可使用 _WS_ 前缀的常量\n@add 用数值指定要添加的样式,可使用 _WS_ 前缀的常量\n@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量\n如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos\n细节请参考 win.modifyStyle 函数源码 !SysIPAddress.modifyStyleEx(.(remove,add,swpFlags) = 修改窗口扩展样式,所有参数都是可选参数,\n@remove 用数值指定要移除的样式,可使用 _WS_EX_ 前缀的常量\n@add 用数值指定要添加的样式,可使用 _WS_EX_ 前缀的常量\n@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量\n如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos\n细节请参考 win.modifyStyle 函数源码 !SysIPAddress.close() = 关闭控件窗 !SysIPAddress.capture = 是否捕获全局鼠标消息 !SysIPAddress.invalidate(__/*可选使用::RECT()对象指定客户区*/) = 使窗口绘图区无效 !SysIPAddress.invalidate(__/*可选使用::RECT()对象指定客户区*/,0) = 使窗口绘图区无效\n不刷新背景 !SysIPAddress.update() = 重绘invalidate函数指定的区块 !SysIPAddress.setFocus() = 设置焦点 !SysIPAddress.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置(句柄或_HWND前缀常量)则调整Z序 !SysIPAddress.getPos() = 返回相对坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd) !SysIPAddress.orphanWindow() = 使控件脱离原来的窗口,可以显示在父窗口外面,\n但仍然显示在原来的位置,继续如影随形的跟随父窗口移动或改变大小,\n控件原来的固定边距等参数仍然有效 !SysIPAddress.text = IP 地址文本格式 !SysIPAddress.address = IP地址数值格式 !SysIPAddress.setRange(.(起始IP,结束IP) = 设置IP范围\n参数可以是文本,也可以分别是指定四组数值的数组 !SysIPAddress.threadCallable() = 开启此控件的跨线程调用功能 !SysIPAddress.onFieldChanged = @.onFieldChanged = function(field,value){ __/*IP 变更事件,\nfield 是变更字段的位置,可能值为1,2,3,4之一,\nvalue 是实际变更字段的数值,字段为空时值为 -1*/ } !SysIPAddress.onChange() = @.onChange = function(){ __/*响应事件,文本内容已变更*/ } !SysIPAddress.onFocusGot() = @.onFocusGot = function(){ __/*响应事件,已获得输入焦点*/ } !SysIPAddress.onFocusLost() = @.onFocusLost = function(){ __/*响应事件,已失去输入焦点*/ } !SysIPAddress.sendMessage(.(msg,wParam,lParam) = 发送窗口消息\n此函数用法请参考 ::User32.SendMessage !SysIPAddress.postMessage(.(msg,wParam,lParam) = 投递窗口消息到消息队列中\n此函数用法请参考 ::User32.PostMessage end intellisense***/