Windows Form AutoScaling
1 |
寫Windows Form的人應該都會面對這類問題。
一直跑得好好的程式傳來噩耗,在某某大官的機器上圖歪字斜,最要命的是老爺子找不到送出鈕可按,正暴怒中。戒慎恐懼地前往"命案現場"(沒處理好的話,馬上就是了)查看,載著厚重老花眼的層峰長官,怒指著LCD控訴你寫的什麼鬼表單,居然沒有送出鈕。定神一看,媽呀! 設成800X600還加大字型(120DPI),原本精巧可愛、手帕大小的表單,現在大如床單,一個個國字猶如魚丸,按此比例推算,原本在右方的送出鈕現在應該位於隔壁祕書Partition隔板的分機表上...
Windows彈性化的桌面解析度及大小字型設計方便了許多髮蒼蒼視茫茫的"資深"使用者(相信很快我也會用到),但這顯然是許多在慣用高解析度的開發者較難想像的情境。雖然我們可以透過基本解析度要求的方式排除部分差異太大的作業環境,但使用大字型是一些眼力不佳使用者不得不的選擇。幸好,.NET程式很貼心地提供了自動縮放的功能,在.NET 1.1可以設定Form.AutoScale,.NET 2.0則有Form.AutoScaleMode更進一步可以選擇跟著Font大小或螢幕DPI大小調整Form的大小(例如: 希望表單佔螢幕一定的比例)。
底下是一個用.NET 1.1寫的簡單範例:
其中(1)是在我1280x1024+96DPI Font本機桌面的顯示,(2)是AutoScale=false在1024x768+120DPI Font桌面的顯示,字變大了,但表單寬度沒變大(但Form Title有變高),所以右方的"高度"兩個字就看不到了。 (3)是AutoScale=true(預設值)的情形,可以看到表單隨著字型變寬也變高,文字可以完整展現。
但問題來了,並不是所有的配置元素都可以等比例放大(例如: 圖檔),或是放大後有可能超出原本預估的螢幕寬度,於是畫面配置錯亂,有些按鈕則飛到九天之外。要解決這個困擾,我想到的幾種解決辦法是:
1) 善用Panel等Container的Scroller功能,允許使用者捲動可視範圍玩一下尋寶遊戲。(操作起來會很累)
2) 針對不同解析度設計多組版型。(使用者很爽,開發者很累)
3) 將字型大小設為固定的Pixel單位(預設為Point),則字的大小將不隨使用者桌面的DPI而有所變化。(使用者可能抱怨字型過小)
每個解決辦法都有其缺點,就視不同的情境運用吧!
另外,今天發現VS.NET 2003有個Bug,使用96DPI環境設計的專案,在另一台120DPI的機器上以VS.NET 2003開啟時,PictureBox等物件會被偷改尺寸加以放大,這個雞婆的舉動糟透了。要避免此一問題,可以將Form.AutoScale先設為false。參考資料如後: http://www.dotnet247.com/247reference/msgs/37/186063.aspx
Comments
# by 谷哥外匯煉金堂
感謝大大的講解,正好需要 pixel 的解決方式