論wpf的設備無關性 - 簡書

論wpf的設備無關性 - 簡書

原文:論wpf的設備無關性 - 簡書

?

WPF從發布之日起,一直將“分辨率無關(resolution independence)”作為其亮點,聲稱使用WPF制作的用戶界面在輕巧的Ultra-Mobile PC的屏幕上和在50英寸的電視機上都能很好地顯示。微軟之所以稱WPF具備“分辨率無關”這一特性,主要是因為WPF的坐標單位設計成為以1/96英寸為一個邏輯像素單位,而不是與設備相關的像素單位。

但是微軟本身對WPF“分辨率無關”這一特性沒有作更多的具體解釋,導致用戶會產生很多誤解。

誤解之一

改變顯示器的分辨率設置,同一個WPF的用戶界面和繪制的圖形尺寸不會變化。

這個可以用一個非常簡單的實驗證明該結論是錯誤的。新建一個WPF應用程序窗口,其中高度為400DIUs(DIU:Device independent unit,設備無關單位),寬度為600DIUs,讓這個窗口分別在分辨率設置為1280 * 1024和800*600的環境下運行,如下圖所示,兩個窗口的尺寸是明顯不一樣的。

圖?1?左圖為1280 * 1024分辨率,右圖為800*600分辨率

?

誤解之二

?

改變顯示的DPI設置,同一個WPF的用戶界面和繪制的圖形尺寸不會變化。

顯示的DPI設置,在XP系統下是通過右鍵——屬性——設置選項卡——高級,可以調用出來,如下圖所示:

圖?2?顯示屬性DPI設置

這個也可以用同樣的方法進行證明該結論是錯誤的。仍然是高度為400DIUs[1],寬度為600DIUs的窗口分別運行在96DPI和192DPI兩種設置環境下。從下圖也可以明顯看出窗口的尺寸是不一樣的。

圖?3?左圖為96DPI,右圖為192DPI

?

?

?

在不同屏幕上,如果DPI設置相同,則同一個WPF的用戶界面和繪制的圖形尺寸不會變化。

在這個地方有必要對屏幕的DPI設置進行一下解釋說明。DPI設置是指屏幕上每英寸多少個像素,比如當前設置為96DPI,即屏幕上96個像素為1英寸。一般的Windows XP系統有正常尺寸(96DPI)、大尺寸(120DPI)和自定義尺寸三種選項。既然WPF的坐標單位是以1/96英寸為一個邏輯像素單位,那么我們有理由相信,如果兩個顯示器的DPI設置是相同的,那么同一個WPF的用戶界面和繪制的圖形尺寸不會變化。很遺憾,這樣的結論依舊是一個錯誤。

CalvinP.Schrotenboer?也用一個實驗證明這是一個錯誤。實驗環境如表 1,比如桌面LCD顯示器實際屏幕寬度和高度(像素單位)為1600 x 1200,這個和普通的分辨率設置需要區分,這是顯示設備的最大分辨率或者說是物理分辨率,即物理上該顯示器屏幕上是1600 x 1200個像元,英文中又稱這種分辨率為“native resolution(原生分辨率)”。由于兩個屏幕物理尺寸也不一樣,所以實際的物理DPI可以通過表中的計算公式得到。實際的物理DPI和操作系統的DPI設置是沒有什么聯系的。

表?1實驗環境

?

在兩個不同系統當中運行同一個WPF應用程序,該程序了繪制了一條長為384DIUs的直線,換算成英寸即為384/96= 4英寸。結果在兩個系統當中的實際尺寸如下圖所示:

圖?4?上圖實際尺寸為4.08英寸,下圖實際尺寸為3.28英寸(CalvinP.Schrotenboer,2006)

?

問題出在哪兒了?

其實從表 1當中就能看出一些端倪,原因正是在于實際的物理DPI和操作系統設置的DPI不一致造成的。WPF無法知道當前使用設備實際的物理DPI為多少,相反通過操作系統的API函數獲得操作系統的DPI值,然后簡單地認為這就是實際的物理DPI值。比如在桌面LCD顯示器上,實際一個物理像元的尺寸為1/94英寸,由于操作系統設置為96DPI,因此WPF還固執地以為一個實際的像元為1/96英寸,因此線段長度為1/94 * 384 = 4.08英寸。筆記本顯示器實際一個物理像元的尺寸為1/117英寸,因此線段長度為1/117 * 384 = 3.28英寸。這個值和我們測量的結果正好相符。

那么我們有理由推測,如果將操作系統的DPI設置成實際的物理DPI,則能做到真正的“分辨率獨立”,即在兩個不同顯示器上顯示的線段長度都為4英寸,如圖 5所示:

圖?5?左圖為桌面LCD顯示器,將DPI設置成為94,右圖為筆記本顯示器,將DPI設置成為117

WPF的“分辨率無關”到現在為止已經是山高月小,水落石出。那么我們還要接著討論另一個問題,在顯示器上存在這樣的問題,那么是否在打印機上也存在這樣的問題呢?仍然可以用一個實驗證明。同樣繪制一個4英寸的直線,分別在DPI設置為96DPI和120DPI下進行打印,得到的打印結果尺寸相同。如下圖所示:

圖?6?左圖為系統設置120DPI下打印結果,右圖為系統設置96DPI下打印結果

?

結論

通過上面幾個實驗分析,我們可以得到如下兩個結論:

(1)??????????????WPF在打印得時候可以做到“分辨率無關”,即同一個WPF用戶界面和繪制的圖形尺寸在任何一臺打印機上輸出都是一致的;

(2)??????????????當顯示器實際象元的物理尺寸和系統設置的DPI保持一致的時候,WPF可以在顯示器上做到“分辨率無關”,即同一個WPF用戶界面和繪制的圖形尺寸在任何一臺顯示器(實際象元的物理尺寸和系統設置的DPI保持一致)上輸出都是一致的。反之則無法保證。

更多的討論

“分辨率無關”這樣一個概念,由于微軟本身討論得不多,的確容易造成誤解。最為詳細地討論了WPF當中“分辨率無關”的是CalvinP.Schrotenboer 的一篇博文“Is WPF Really Resolution Independent?”。當然Charles Peztold也在自己的博客當中討論過這個問題。另外在微軟的論壇上StephenW,Charles Peztold等人也就WPF的“分辨率無關”和“設備無關”作了比較深入的討論。

用戶固然可以不理睬這些,但是對于一個程序員來說,尤其是一個正在做繪圖程序的程序員,尤其尤其是一個還需要打印輸出的繪圖程序員,是需要清楚這其中細節的。而且了解細節本身也是一件很愉快的事情。



作者:yang13
鏈接:https://www.jianshu.com/p/5d56826d36e0
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
posted on 2019-03-27 23:37 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/10612083.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

暑期學習總結6

本周書面學習時間大概6小時,代碼上5小時,java的基礎知識已經基本都學過一遍了,剩下的就是要鞏固,進行了一些實例操作,過程還算滿意,類的運用已經掌握了很多,現在已經習慣了java的類定義方法&…

javaScript第七天(1)

JavaScript基礎 核心知識點 Math對象中的方法數組對象中的方法字符串中的方法 今日學習目標 能夠掌握Math對象中的相關方法能夠掌握數組對象中的push方法能夠掌握操作字符串的方法 內置對象介紹 ? JavaScript組成: ECMAScript | DOM | BOM ? ECMA…

ISLR學習筆記(2)線性回歸

第三章 幾種常見的線性模型 1、簡單線性回歸 Y≈β0β1X 2、多元線性回歸 Y≈β0β1X1β2X2... 3、擴展線性回歸 Y≈β0β1X1β2X2β3X1X1 克服了多元線性模型 X1X1 與 X2X2 不協同作用的假設。 4、多項式回歸 Y≈β0β1X1β2X12β3log(X1)β4√X4 轉載于:https://www.cnblog…

淺談Aho-Corasick automaton(AC自動機)

Aho-Corasick automaton是什么? 要學會AC自動機,我們必須知道什么是Trie,也就是字典樹。Trie樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計和排序大量的字符串&#xff…

javaScript第七天(2)

javaScript基礎 ? 對象其他部分 [理解] 自定義構造函數創建對象[掌握] //繼續簡化 自定義構造函數 function People(uName, uAge) {this.uName uName;this.uAge uAge; } // 如何通過自定義構造函數創建對象? var zs new People(張三, 20); console.log(zs);注意事項: 自定…

數據挖掘、機器學習書籍推薦!!

強烈推薦:《機器學習》 (西瓜書) 入門讀物: 《深入淺出數據分析》 這書挺簡單的,基本的內容都涉及了,說得也比較清楚,最后談到了R是大加分。難易程度:非常易。 《啤酒與尿布》 通過案例來說事情&#xff0c…

樓蘭圖騰(權值線段樹)

在完成了分配任務之后,西部314來到了樓蘭古城的西部。 相傳很久以前這片土地上(比樓蘭古城還早)生活著兩個部落,一個部落崇拜尖刀(‘V’),一個部落崇拜鐵鍬(‘∧’),他們分別用V和∧的形狀來代表各自部落的圖騰。 西部314在樓蘭古…

js(Dom+Bom)第一天(1)

JavaScript-DOM(BOM)操作 核心知識 獲取頁面元素事件設置樣式 學習目標 能夠使用id名,標簽名等方式獲取頁面中元素能夠給標簽注冊點擊事件,并實現對應效果能夠給標簽通過js方式設置樣式 JavaScript組成 ECMASCRIPT (基礎語法) DOM(文檔對…

[HZNOI #koishi] Magic

[HZNOI #514] Magic 題意 給定一個 \(n\) 個點 \(m\) 條邊的有向圖, 每個點有兩個權值 \(a_i\) 和 \(b_i\), 可以以 \(b_i\) 的花費把第 \(i\) 個點的 \(a_i\) 變成 \(0\). 最后每個點 \(i\) 產生的花費為所有從 \(i\) 出發能通過一條有向邊直接到達的點 \(j\) 的 \(a_j\) 的 \…

同步與異步

同步: 做完一件事,再做另一件 煮好水,再拆泡面包裝 異步: 可以同時做好幾個任務 燒水,打開火之后,先去拆泡面包裝,等水開了,再停下拆包裝,去關掉火。。。。。 轉載于:htt…

js(Dom+Bom)第一天(2)

webAPI 00-復習 內置對象中的方法 01-JavaScript組成 知識點-ECMASCRIPT 重點回顧 存儲容器 變量數組對象 邏輯語法 分支語句循環語句switch語句 知識點-BOM 概念 Browser Object Model (瀏覽器器對象模型) 操作瀏覽器將瀏覽器看做是一個對象.作用 通過js操作瀏覽器中相…

mysql 主主復制的配置流程

1、先關閉B,把A的數據導出來,mysqldump -hlocalhost -uroot -p123456 --database ibprpu >ibprpu.sql2、關閉A,啟動B,進入mysql建立一個新的數據庫 create database ibprpu3、導入數據庫 mysql -hlocalhost -uroot -p123456 &l…

華為架構師8年經驗談:從單體架構到微服務的服務化演進之路

本次分享的技術大綱如下: 傳統應用開發面臨的挑戰服務化實踐服務化不是銀彈服務化架構的演進方向一 、傳統應用開發面臨的挑戰 挑戰1-- 研發成本高 主要體現在如下幾個方面: 代碼重復率高在實際項目分工時,開發都是各自負責幾個功能&#xff…

輪播圖制作(1)

輪播圖制作 <body><div><img src"img/1.jpg" class"imgs" alt""><a href"#" class"left"><</a> //此處的箭頭也可以用圖標做出來<a href"#" class"right">>…

StringUtils工具類的常用方法

StringUtils 方法的操作對象是 java.lang.String 類型的對象&#xff0c;是 JDK 提供的 String 類型操作方法的補充&#xff0c;并且是 null 安全的(即如果輸入參數 String 為 null 則不會拋出 NullPointerException &#xff0c;而是做了相應處理&#xff0c;例如&#xff0c…

struts2+extjs文件上傳完整實現(攻克了上傳中的各種問題)

版權聲明&#xff1a;本文為博主原創文章。未經博主同意不得轉載。 https://blog.csdn.net/shanhuhau/article/details/28617999 首先須要引入上傳控件 <script type"text/javascript" src"<%basePath%>/js/ext/examples/ux/fileuploadfield/FileUploa…

放大鏡制作(1)

放大鏡制作 <div class"box" id"box"><!--左側的盒子--><div class"small"><!--圖片--><img src"images/big.jpg" width"350" class"aaa" alt""/><!--黃色小盒子--&…

.NET Framework 2.0 組件和非托管代碼與交互操作詳解(轉)

.NET Framework 將促進與 COM 組件、COM 服務、外部類型庫和許多操作系統服務的交互操作。在托管和非托管對象模型之間&#xff0c;數據類型、方法簽名和錯誤處理機制都存在差異。為了簡化 .NET Framework 組件和非托管代碼之間的互用并便于進行移植&#xff0c;公共語言運行時…

git 刪除遠程分支和本地分支

刪除遠程分支和本地分支 https://www.cnblogs.com/luosongchao/p/3408365.html 將遠程git倉庫里的指定分支拉取到本地&#xff08;本地不存在的分支&#xff09; https://www.cnblogs.com/hamsterPP/p/6810831.html 轉載于:https://www.cnblogs.com/mafeng/p/10619419.html

從零開始實現ASP.NET Core MVC的插件式開發(四) - 插件安裝

標題&#xff1a;從零開始實現ASP.NET Core MVC的插件式開發(四) - 插件安裝 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11343141.html 源代碼&#xff1a;https://github.com/lamondlu/Mystique 前情回顧 從零開始實現ASP.NET Core MVC的插…