最初的任務欄并不是你今天看到的那樣。在那個時候,默認情況下,任務欄會顯示在屏幕的頂部,其外觀類似于下圖:
這絕對不是它實際的樣子,但是因為時間太過久遠了,以至于我忘記了它那個時候真實的外觀(我沒有意識到十年後還會讨論這個),不過基本的外觀就是這樣的,用它來作為讨論的基礎應該也足夠了。
重點在于,這個任務欄采用了标簽頁的形式,而不是采用按鈕。每一個标簽頁都對應一個運行時的窗口,同時窗口會和标簽頁融合在一起。因此,你可以通過點擊不同的标簽頁來切換不同的窗口。
你可以從标簽控件(Tab Control)的TCS_BUTTONS這個類型風格中看到這種設計的痕迹。當我們切換到按鈕版本的任務欄後,在實現代碼中我們仍然保留了很多基于标簽頁版本的窗口切換代碼,因為相對于重寫所有窗口切換代碼,我們更傾向于向現有的标簽頁上添加按鈕的風格,這樣需要做的工作就會更少。
為什麼放棄頂端設計因為各種不同的原因,标簽式的任務欄設計被開發團隊丢棄了。其中一個很多人早就意識到的原因是:如果你将任務欄放到屏幕的頂部,那麼,大部分的窗口将會被這個任務欄所覆蓋,因為在這些窗口的意識裡,可用的屏幕區應該從屏幕原點(0, 0)開始。另外一些窗口則會”爬”到任務欄上,因為它們使用到了GetWindowPlacement這個API來保存它們的位置(這個API會嘗試返回工作區的坐标,而工作區會從(0, 0)開始計算),但卻會使用SetWindowPos來恢複窗口的位置(這個API會使用屏幕坐标系,(0, 0)将會是屏幕的左上角)。
因為有如此多的應用程序窗口都會被位于頂部的任務欄所覆蓋,所以我們抛棄了這個任務欄設計,将它放到了屏幕底部。
八年過去了,我們還是會看到這樣一番景象:當任務欄被用戶設置為停靠在屏幕頂端或者屏幕左側時,因為應用窗口沒搞明白屏幕坐标系和工作區坐标的關系,導緻這些窗口還是會被任務欄所覆蓋。這确實是一個問題。
總結作為Windows客戶端開發人員,需要搞明白的一個地方就是屏幕坐标系和客戶區坐标系的區别。
請記得,屏幕坐标系的原點位于真實屏幕的左上角,而客戶區的原點是窗口客戶區的左上角,通常這兩個點是不重合的。
可以使用這兩個API實現這兩種坐标系的轉換:ClientToScreen和ScreenToClient。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!