//minmax 限制窗口大小 import win.appBar; namespace win.ui; class minmax{ ctor(winform,argsMinCx,argsMinCy,argsMaxCx,argsMaxCy){ if(winform._minmaxSetting){ this = winform._minmaxSetting; ..table.assign(this.argsMin,{cx=argsMinCx;cy=argsMinCy}); ..table.assign(this.argsMax,{cx=argsMaxCx;cy=argsMaxCy}); return this; } if( ! (argsMinCx && argsMinCy) ){ var rc = ..win.getPlacement(winform.hwnd).rcNormalPosition; argsMinCx = rc.width(); argsMinCy = rc.height(); } this.argsMin = {x=argsMinCx;y=argsMinCy} this.argsMax = {x=argsMaxCx;y=argsMaxCy} this.updateMinMaxInfo = function(){ var minWidth,minHeight,maxWidth,maxHeight = this.argsMin.x,this.argsMin.y,this.argsMax.x,this.argsMax.y; //DPI 缩放 var dpiX1,dpiY1 = winform.dpiScale(1,1); minWidth = minWidth * dpiX1; minHeight = minHeight * dpiY1; if(maxWidth!==null) maxWidth = maxWidth * dpiX1; if(maxHeight!==null) maxHeight = maxHeight * dpiY1; //计算边框与标题栏高度 if(..win.getStyle(winform.hwnd,0x800000/*_WS_BORDER*/)) { var style,styleEx = ..win.getStyle(winform.hwnd),..win.getStyleEx(winform.hwnd); var bMenu = !!winform[["menu"]]; var rc = ::RECT(0,0,minWidth,minHeight); ::User32.AdjustWindowRectEx(rc, style,bMenu,styleEx);//left,top 会变为负数 minWidth,minHeight = rc.width,rc.height; rc.setPos(0,0,maxWidth,maxHeight); ::User32.AdjustWindowRectEx(rc, style,bMenu,styleEx);//left,top 会变为负数 if(maxWidth!==null) maxWidth = rc.width; if(maxHeight!==null) maxHeight = rc.height; } var x,y = 0,0; //获取当前显示器位置 var monitorInfo = ..win.getMonitorInfo(winform.hwnd); if( monitorInfo){ if(!maxWidth) maxWidth = monitorInfo.rcWork.right - monitorInfo.rcWork.left; if(!maxHeight) maxHeight = monitorInfo.rcWork.bottom - monitorInfo.rcWork.top; x = monitorInfo.rcWork.left - monitorInfo.rcMonitor.left; y = monitorInfo.rcWork.top - monitorInfo.rcMonitor.top; } else{ var rcWork = ..win.getWorkArea(); if(!maxWidth) maxWidth = rcWork.width(); if(!maxHeight) maxHeight = rcWork.height(); x = rcWork.left; y = rcWork.top; }; //计算系统任务栏大小 var taskBar = ..win.appBar.getTaskBar(); if( taskBar ? taskBar.state == 1/*_ABS_AUTOHIDE*/){ var edgeY = ::GetSystemMetrics(46/*_SM_CYEDGE*/); var edgeX = ::GetSystemMetrics(46/*_SM_CYEDGE*/); if( taskBar.uEdge == 0x3/*_ABE_BOTTOM*/ ){ maxHeight -= edgeY; } elseif( taskBar.uEdge == 0x2/*_ABE_RIGHT*/ ){ maxWidth -= edgeX; } elseif( taskBar.uEdge == 0x1/*_ABE_TOP*/ ){ y += edgeY; maxHeight -= edgeY; } elseif( taskBar.uEdge == 0x0/*_ABE_LEFT*/ ){ x += edgeX; maxWidth -= edgeX; } } if( minWidth > maxWidth ){ minWidth = maxWidth; } if( minHeight > maxHeight ){ minHeight = maxHeight; } this.maxPosition.x = x; this.maxPosition.y = y; this.maxSize.x = maxWidth; this.maxSize.y = maxHeight; this.maxTrackSize.x = maxWidth; this.maxTrackSize.y = maxHeight; this.minTrackSize.x = minWidth; this.minTrackSize.y = minHeight; return this; } winform.getMinMaxInfo = this.updateMinMaxInfo; winform.onGetMinMaxInfo = function(hwnd, message, wParam, lParam){ ..raw.convert(lParam,this); this.updateMinMaxInfo(); ..raw.copy(lParam,this); return 0; }; winform._minmaxSetting = this; }; struct reserved = ::POINT(); struct maxSize = ::POINT(); struct maxPosition = ::POINT(); struct minTrackSize = ::POINT(); struct maxTrackSize = ::POINT(); } import win.ui.ctrl.metaProperty; ..win.ui.ctrl.metaProperty.mixin({ minmax = function(...){ return ..win.ui.minmax(owner,...); } }) /**intellisense() win.ui.minmax = 窗口缩放范围设置器。\n一个窗口只能 win.ui.minmax( = 创建窗口缩放范围设置器\n一个窗口只能创建一次,重复调用将重用并返回第一次创建的设置器 win.ui.minmax(.(winform,最小宽度,最小高度,最大宽度,最大高度) = 除第一个参数以外,其他参数可选\n默认最小为当前窗口大小,最大为最大化大小 win.ui.minmax() = !minmaxSetting. !minmaxSetting.updateMinMaxInfo() = 重新计算窗口缩放大小范围\n!minmaxSetting. !minmaxSetting.maxSize = 自动维护此属性请不要修改,应修改 argsMax\n!point. !minmaxSetting.maxPosition = 自动维护此属性请不要修改,应修改 argsMax\n!point. !minmaxSetting.minTrackSize = 自动维护此属性请不要修改,应修改 argsMin\n!point. !minmaxSetting.maxTrackSize = 自动维护此属性请不要修改,应修改 argsMax\n!point. !minmaxSetting.argsMin = 可指定包含 x,y 字段的表对象,用于限制窗口最小宽高。\n修改此属性与修改 win.ui.minmax 的构造参数作用一样\n!size. !minmaxSetting.argsMax = 可指定包含 x,y 字段的表对象,用于限制窗口最大宽高。\n修改此属性与修改 win.ui.minmax 的构造参数作用一样\n\n!size. end intellisense**/