前言
很久之前,我用易语言做了一个简单的能在桌面是发弹幕的程序。
众所周知,易语言有着诸多不足(如代码是二进制文件),所以我用 Visual Basic 重做了它:https://github.com/wsrj/desk-danmaku-vb
使用方法
主界面
主界面非常简单,只有弹幕文字、字体和颜色,还有一个比较重要的:弹幕最大宽度。
为什么要设置这个值呢?看下面“原理”一节就能知道,弹幕文字是被放进一个“容器”(窗口)里的,这个值就是容器的宽度。如果容器宽度不足,文本会换行。
目前我还做不到根据字号和文本长度计算宽度,所以只能自己选择了。
填写以上全部内容后,单击“发送”按钮,一条“弹幕”就会出现在你的桌面上,是不是很简单?(〜 ̄△ ̄)〜
命令行参数
此程序的语法是:
1 | |
| 参数 | 说明 |
|---|---|
/? |
显示帮助信息。-h, --help等价于/?。 |
/C |
启用控制台。控制台中会显示程序运行时的一些信息。-c,--console等价于/C。 |
原理
弹幕
前面提到,弹幕实际上是被放进一个窗口中的。Win32 API 有两个函数:SetWindowLong和SetLayeredWindowAttributes。微软官网有对应的文档:
https://learn.microsoft.com/zh-cn/windows/desktop/api/winuser/nf-winuser-setwindowlonga
https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setlayeredwindowattributes。
分层窗口(layered window)支持设置背景透明度。也就是说,使用SetWindowLong给窗口设置WS_EX_LAYERED(分层)样式,再用SetLayeredWindowAttributes设置背景完全透明,就可以得到一个透明的窗口。在窗口上放置一个撑满整个窗口的标签控件,把标签背景改为透明,就可以实现“弹幕”的效果了。