美文网首页
Win32 的 Tab Control 玩出花样来

Win32 的 Tab Control 玩出花样来

作者: 天下第九九八十一 | 来源:发表于2021-04-21 19:27 被阅读0次

Win32 默认的 Tab Control 名为 SysTabControl32,很古老,很复杂,也很简陋。如果想要修改,那很难, 因为Windows不比安卓,后者是开源项目,什么都可以复制一份;而想改Windows的控件,没有门路只能瞎抓。

偏个题,Windows 平台的UI技术,一些名称都很另类,不想了解。DirectUI,难道其他的UI技术就是间接的么,就你直接?原来是因为其始祖代码有一点 Direct X 的关系。WPF,WTF?看全称,Windows Presentation Foundation,我只能说三个单词都我看得懂、会念,但具体是什么意思?QT,就两个字母,没啥槽点,也不知道啥意思,只知是个付费的 GPL 界面框架,还不是 LGPL。

还是最爱 Java 啊,恨不能装上比尔盖茨性能的大脑,致君尧舜上!

Linux 平台有一个很有趣的项目,Wine, 相信大家都有所耳闻,毕竟一搜索“linux 运行 exe”就出来这个。Wine 启动器以兼容 POSIX 接口的操作系统为依托,在其上直接运行为Windows平台编译的二进制文件,兼容性有时甚至超过XP,十分有趣。

Windows 上可以运行 Wine 吗,如果可以,那我们岂不是有了“开源”Windows ?这个问题没有直接的肯定答案。简单的回答是不能,不过有人通过在 Win 10 的子系统装 Wine,然后连接子系统的桌面的方式间接完成了这一项“壮举”。

灵光一闪,为什么要在 Windows 上追求先运行 Wine 再运行 EXE呢?说不定 Wine 的代码可以直接编入 EXE!这才是我要的 DirectUI !

于是,我找来 Wine 的 tab.c 。修改后果然可以编译运行。将类名 SysTabControl32 修改为 MyTabControl32,直接替换系统的标签控件,各种宏消息控制几乎完全一样。

在这个基础上,可以将 Tab Control 定制出花样来。比如已经实现的有:

  1. 逼近原生控件的多行布局方式:多行的标签/选项卡布局,如果有的行只显示了一两个选项卡,那显然布局就不合理。观察原生控件,发现规律:每一行的最少标签数目,等于截止到这一行的所有行数+1,比如,从一开始数,第三行的最少标签数目为3+1=4,第二行的最少标签数目为2+1=3,第一行没有最少标签数目。按照这个规律,模仿出新的多行布局方法:先按照放得下就放的原则,将标签项一个个地放进布局中,每超出界面宽度就新起一行。然后是第二轮布局,从最底下的一行开始,检查子项数目是否少于最少标签数目,若是,则从上一行“借”,使其数目满足最少标签数目,或者新的宽度超出上一行。然后再检查最末第二行,等等……

  2. 给多行标签页加上行数限制。多行标签页有个槽点就是若窗口宽度足够小或标签页项目足够多,那么标签页的顶部会占据全部显示空间,还给不给实际的页面一点点活路了?解决方案很简单,参考单行标签页水平滚动的实现,为多行标签页加上行数限制,超出限制就开启垂直滚动:

限制三行。上下箭头控件名为 UPDOWN_CLASS / msctls_updown32
  1. 垂直标签页。可用鼠标拖拽缩放,分分钟超越 Edge 的垂直标签页。

控件项目的开源地址 :https://github.com/KnIfER/MyTabControl32,协议沿用LGPL。

附 github 上的 WPF 标签页控件,支持分窗口、停靠功能,有动图演示,看上去很好:http://github.com/ButchersBoy/Dragablz

https://dragablz.net/

另外 Sumatra Pdf 的也不错,看上去是想模仿chrome的标签页。

不过,我仍然想用自己的这个标签页控件搞点东西出来,作为唯一支持多行模式、垂直模式的控件,应该适合词典类应用。

相关文章

网友评论

      本文标题:Win32 的 Tab Control 玩出花样来

      本文链接:https://www.haomeiwen.com/subject/brbzlltx.html