//round 圆角无边框窗口 import gdi; import win.region; import win.ui.minmax; namespace win.region; class round { ctor(winform,minX,minY,wEllipse=12,hEllipse){ this = winform var maxminInfo = ..win.ui.minmax(winform,minX,minY); if(wEllipse && hEllipse === null ) hEllipse = wEllipse; roundRectRgn(winform,winform.dpiScale(wEllipse,hEllipse)); if(winform._shadowWindow){ winform._shadowWindow.setRadius(wEllipse*0.8,wEllipse); } winform.adjust = function(cx,cy,wParam){ if( wEllipse <=0 || hEllipse <=0 ) return; if( wParam != 0x2/*_SIZE_MAXIMIZED*/ ){ roundRectRgn(winform, winform.dpiScale(wEllipse,hEllipse)); if(winform._shadowWindow){ winform._shadowWindow.setRadius(wEllipse*0.8,wEllipse); } } else { ::SetWindowRgn( winform.hwnd, , true ); } }; }; setEllipse = function(w,h){ if( w > 0 && h > 0 ){ wEllipse,hEllipse = w,h; roundRectRgn(winform, winform.dpiScale(wEllipse,hEllipse)); } else { wEllipse,hEllipse = w,h; ::SetWindowRgn( winform.hwnd, , true ); } }; setMinTrackSize = function(minX,minY){ with maxminInfo.minTrackSize{ x = minX; y = minY; } }; } namespace round{ roundRectRgn = function (winform,wEllipse=12,hEllipse) { if(wEllipse && hEllipse === null ) hEllipse = wEllipse; if( ! (wEllipse && hEllipse) ) return; var rc = winform.getRect(); var hRgn = ::CreateRoundRectRgn( 0, 0, rc.right - rc.left + 1, rc.bottom - rc.top + 1, wEllipse, hEllipse ); ::SetWindowRgn( winform.hwnd, hRgn, 1 ); }; } /**intellisense() win.region.round = 圆角无边框窗口支持库 win.region.round( = 创建一个圆角无边框窗口。\n最大化自动取消圆角。 win.region.round(.(winform,窗体最小宽度,高度,圆角宽度,高度) = 除第一个参数以外,其他参数可选。参数 winform 必须指定无边框窗口(窗体构造参数表的 border 属性为 "none")。\n默认取窗体当前大小为最小大小,\n圆角宽度默认为 12 个像素(请指定 DPI 缩放前大小),圆角高度默认等于圆角宽度。 win.region.round() = !winReginRound. !winReginRound.setMinTrackSize(.(窗体最小宽度,高度) = 设置窗体最小宽度,高度 !winReginRound.setEllipse(.(圆角宽度,圆角高度) = 重新设置圆角大小 end intellisense**/ /**details(范例) [范例](doc://example/Windows/Effects/round.aardio) end details**/