无边框窗口:指的是在窗体设计器中将窗体的初始化属性 border(边框) 的值设为 "none", 这种窗口不再有默认的边框、阴影、标题栏。示例:
import win.ui;
/*DSG{{*/
var winform = win.form(text="无边框窗口";border="none";bgcolor=0xFFFFFF)
/*}}*/
winform.show();
win.loopMessage();
注意隐藏标题栏、并将边框属性设为 "resizable" 不是无边框窗口, 这种在不同操作系统上显示效果都很差,要么是多出一圈,要么顶上多出一块。 只有边框 为 "none" 的才是真正的无边框窗口。
上面这种无边框窗口,同时也就没有了默认的标题栏按钮,我们就只能按 Alt+F4 关闭窗口。
好处是我们可以自行定义标题栏也边框了。
为无边框窗口添加阴影边框、标题栏(包含标题栏按钮)最简单的方法就是使用标准库的 win.ui.simpleWindow 。
示例:
/*
为无边框窗口添加阴影边框、可拖动边框,自定义的窗口标题栏(包含标题栏按钮)。
如果窗口设计时属性中最大化按钮设为隐藏(false),则最大化按钮以及可拖动边框不会出现。
*/
import win.ui.simpleWindow;
win.ui.simpleWindow(winform);
win.ui.simpleWindow 创建的标题栏按钮默认使用透明背景与白色字体,
而窗口背影默认也是浅色的,所以最好在标题栏的位置先放置一个件 bk 或者 bkplus 这样的背景贴图控件,设置为深色背景。
并将该 bk 或 bkplus 控件的固定上边距、固定左边距、固定右边距都设为 true 以适应窗口缩放。
bk 或 bkplus 控件并不会创建窗口,只是在父窗体背景上绘图,所以性能较好,也更适合在上面重叠放置其他控件。
示例:
import win.ui;
//创建无边框(无标题栏)窗口
var winform = win.form(text="aardio form";border="none";bgcolor=0xFFFFFF)
//添加深色的标题栏背景,bgcolor 使用 0xBBGGRR 格式颜色值。
winform.add(
bk={cls="bk";bgcolor=0xA4A0A0;left=0;top=0;bottom=32;marginRight=0;dl=1;dr=1;dt=1;z=1}
)
//添加阴影边框、标题栏等,默认为透背背景,标题栏按钮等默认字体为白色
import win.ui.simpleWindow;
win.ui.simpleWindow(winform);
winform.show();
win.loopMessage();
也可以自定义标题栏按钮配色,示例:
import win.ui;
var winform = win.form(text="aardio form";border="none";bgcolor=0xFFFFFF)
import win.ui.simpleWindow;
var sw = win.ui.simpleWindow(winform);
//标题栏按钮都是 plus 控件,skin 函数用法与 plus 控件相同,颜色使用 0xAARRGGBB 格式
sw.skin(
background = {
hover = 0x44B0C4DE;
active = 0x664682B4;
default = 0x00FFFFFF;
}
color = {
hover = 0xFF191970;
active = 0xFFFFFFFF;
default = 0xFF2F4F4F;
}
)
winform.show();
win.loopMessage();
标准库提供了以下的几个类可以在无边框窗口上创建虚拟的标题栏以及可拖动边框:
下面简单介绍一下 win.ui.simpleWindow 的主要功能是如何实现的,细节请查看这些库的源代码。
模拟窗口标题栏功能的主要函数:
winform.hitMax() //模拟点击最大化按钮
winform.hitMin() //模拟点击最小化按钮
winform.hitClose() //模拟点击关闭按钮
winform.hitCaption() //拖动标题栏
例如鼠标左键按住窗口时允许拖动改变窗口位置:
winform.onMouseDown = function(wParam,lParam){
winform.hitCaption()
}
为窗口添加阴影以及可拖动边框:
import win.ui.shadow;
win.ui.shadow(winform);
也可以用 win.ui.resizeBorder 单纯添加可拖动边框,但如果窗口四边由浏览器组件接管则 win.ui.resizeBorder 有可能不起作用,win.ui.shadow 则可以解决问题(因为阴影边框在窗口之外)。
如果只想添加阴影,不想支持可拖动边框,可以下面这样写:
import win.ui.shadow;
win.ui.shadow(winform).setResizeBorder(false)