Windows解惑:为什么任务栏默认会在屏幕底部

一开始并不是这样
最初的任务栏并不是你今天看到的那样 。 在那个时候 , 默认情况下 , 任务栏会显示在屏幕的顶部 , 其外观类似于下图:
Windows解惑:为什么任务栏默认会在屏幕底部
文章图片
这绝对不是它实际的样子 , 但是因为时间太过久远了 , 以至于我忘记了它那个时候真实的外观(我没有意识到十年后还会讨论这个) , 不过基本的外观就是这样的 , 用它来作为讨论的基础应该也足够了 。
重点在于 , 这个任务栏采用了标签页的形式 , 而不是采用按钮 。 每一个标签页都对应一个运行时的窗口 , 同时窗口会和标签页融合在一起 。 因此 , 你可以通过点击不同的标签页来切换不同的窗口 。
你可以从标签控件(TabControl)的TCS_BUTTONS这个类型风格中看到这种设计的痕迹 。 当我们切换到按钮版本的任务栏后 , 在实现代码中我们仍然保留了很多基于标签页版本的窗口切换代码 , 因为相对于重写所有窗口切换代码 , 我们更倾向于向现有的标签页上添加按钮的风格 , 这样需要做的工作就会更少 。
为什么放弃顶端设计
因为各种不同的原因 , 标签式的任务栏设计被开发团队丢弃了 。 其中一个很多人早就意识到的原因是:如果你将任务栏放到屏幕的顶部 , 那么 , 大部分的窗口将会被这个任务栏所覆盖 , 因为在这些窗口的意识里 , 可用的屏幕区应该从屏幕原点(0,0)开始 。 另外一些窗口则会”爬”到任务栏上 , 因为它们使用到了GetWindowPlacement这个API来保存它们的位置(这个API会尝试返回工作区的坐标 , 而工作区会从(0,0)开始计算) , 但却会使用SetWindowPos来恢复窗口的位置(这个API会使用屏幕坐标系 , (0,0)将会是屏幕的左上角) 。
【Windows解惑:为什么任务栏默认会在屏幕底部】因为有如此多的应用程序窗口都会被位于顶部的任务栏所覆盖 , 所以我们抛弃了这个任务栏设计 , 将它放到了屏幕底部 。
八年过去了 , 我们还是会看到这样一番景象:如果任务栏被用户设置为停靠在屏幕顶端或者屏幕左侧时 , 因为应用窗口没搞明白屏幕坐标系和工作区坐标的关系 , 导致这些窗口还是会被任务栏所覆盖 。 这确实是一个问题 。
总结
作为Windows客户端开发人员 , 需要搞明白的一个地方就是屏幕坐标系和客户区坐标系的区别 。
请记得 , 屏幕坐标系的原点位于真实屏幕的左上角 , 而客户区的原点是窗口客户区的左上角 , 通常这两个点是不重合的 。
可以使用这两个API实现这两种坐标系的转换:ClientToScreen和ScreenToClient 。
Windows解惑:为什么任务栏默认会在屏幕底部
文章图片


    推荐阅读