• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            我們知道,關(guān)于高DPI的支持, Windows XP時代就開始有了, 那時關(guān)于高DPI的支持比較簡單, 但是從Vista/Win7 到現(xiàn)在Win8 /Win8.1, Windows關(guān)于高DPI的支持已經(jīng)發(fā)生了很大的變化, 下面我們依次簡單介紹下。

            如果說以前XP時代我們還有理由不關(guān)注高DPI,  那么在移動設(shè)備時代和大顯示器的高分辨率時代, 我們就沒有理由不關(guān)注高DPI了, 比如Surface Pro的分辨率是1920x1080, 這種情況下如果系統(tǒng)我們不設(shè)置高DPI, 基本上就沒法觸摸和操作了,所以現(xiàn)在普通程序?qū)Ω逥PI的支持已經(jīng)成為趨勢了。 

            什么DPI? 全稱是dots per inch (DPI), 也就是每英寸的點(diǎn)數(shù),在顯示器上就是每英寸的像素個數(shù),Window上一般默認(rèn)是96 dpi 作為100% 的縮放比率, 但是要注意的是該值未必是真正的顯示器物理值, 只是Windows里我們的一個參考標(biāo)準(zhǔn)。

            下面我們思考為什么DPI設(shè)置高了之后, 我們看到的字體會變大? 因?yàn)橄到y(tǒng)字體是是以固定大小(宋體10號字,物理尺寸為(10/72)英寸)設(shè)計(jì)的, 當(dāng)我們DPI設(shè)置高了之后 ,說明該字體要占有更多的像素, 在屏幕分辨率不變的前提下, 看起來也就大了。所以如果我們設(shè)置高DPI,通常也意味著我們的顯示器是高分辨率, 里面的字體看起來太小了, 我們需要提高DPI來把內(nèi)容放大。

            那么我們的程序如何才能支持高DPI? 對于高DPI的支持, 不同操作系統(tǒng)有不同的方案。通常來說如果我們程序支持高DPI, 意味著我們要對繪畫的內(nèi)容進(jìn)行相應(yīng)的放大, 比如字體,圖片和控件等。當(dāng)然, 如果我們用的是系統(tǒng)字體(比如GetStockObject(DEFAULT_GUI_FONT)), 那么這種情況下我們不用操心, 因?yàn)橄到y(tǒng)會對該字體在高DPI時進(jìn)行相應(yīng)的放大; 如果我們是用CreateFont自己創(chuàng)建的字體, 那就要我們自己對該字體進(jìn)行放大了。

            下面我們看XP是如何對高DPI進(jìn)行支持的? 

            XP對高DPI的支持比較差勁, 大部分情況下就是字體的放大, 當(dāng)然我們程序也可以通過GetDeviceCaps(hDC, LOGPIXELSX)獲取DPI后自己對繪畫的內(nèi)容進(jìn)行縮放。

            下面我們看Vista/Win7/Win8是如何對高DPI進(jìn)行支持的?

            我們知道Vista/Win7我們可以禁止DWM(Desktop Window Manager), 該模式我們稱之為Basic模式, 這種模式下的高DPI效果和XP一樣。

            對于DWM沒有禁掉的情況, Vista/Win7/Win8 對高DPI的支持又分為2種情況, 具體看下圖: 

            一種XP風(fēng)格的高DPi支持, 這種方式我們上面討論過了;
            還有一種是通過 DWM 虛擬化支持的 高DPI方式, 下面我們討論下該方式: 

            該種方式的高DPI支持是通過DWM的縮放實(shí)現(xiàn)的, 具體過程是這樣的, 比如我們當(dāng)前系統(tǒng)的DPI是200%, 我們程序運(yùn)行時,系統(tǒng)會告訴你當(dāng)前DPI仍然是96(100%), 所以我們程序會仍然按照100%的方式進(jìn)行繪畫, 但是但是系統(tǒng)給我們的坐標(biāo)是根據(jù)DPI縮小過后的(也就是我們對窗口調(diào)用GetWindowRect或是通過GetSystemMetrics(SM_CXSCREEN)得到的大小會比實(shí)際大小減半) , 當(dāng)我們畫完之后, DWM再對整個窗口進(jìn)行200% 放大后畫到屏幕上, 這樣看起來我們的程序就自動支持高DPI了。

             這種方式看起來很美妙, 但是它也有缺點(diǎn), 主要是經(jīng)過縮放后的內(nèi)容看起來會變模糊, 比如文字會有明顯的鋸齒。

            既然DWM虛擬化用戶效果有時不是那么好, 那么我們很多時候可能會自己支持高DPI, 如何讓我們的程序禁用該效果?
            事實(shí)上我們可以對每個進(jìn)程對DWM虛擬化的支持進(jìn)行設(shè)置和查詢, 系統(tǒng)給我們提供了2個APi: SetProcessDPIAware  IsProcessDPIAware , 通過調(diào)用SetProcessDPIAware , 我們告訴系統(tǒng)不要對我們的程序進(jìn)行DWM虛擬化。

            這里還有特殊情況也提一下: 我們在高DPI下通過窗口句柄取到的坐標(biāo)信息是和目標(biāo)程序是否支持DWM虛擬化相關(guān)聯(lián)的, 我們對支持DWM虛擬化的程序窗口調(diào)用GetWindowRect, 取到的坐標(biāo)也是經(jīng)過DWM縮放后的坐標(biāo); 對禁用DWM虛擬化程序的窗口調(diào)用GetWindowRect, 取到的坐標(biāo)則是沒有經(jīng)過縮放的原始坐標(biāo)。

             最后我們再討論下Win8.1 對高DPI的支持, WIn8.1對高DPi以3種方式支持 Process_DPI_Awareness : 
            typedef enum _Process_DPI_Awareness { 
              Process_DPI_Unaware            = 0,
              Process_System_DPI_Aware       = 1,
              Process_Per_Monitor_DPI_Aware  = 2
            } Process_DPI_Awareness;
            下面我們依次討論這3種方式: 

            第一種Unaware, 該種方式是告訴系統(tǒng), 我的程序不支持DPI aware, 請通過DWM虛擬化幫我們實(shí)現(xiàn)。 該方式和上面Win7/Win8對高DPI的支持的實(shí)現(xiàn)基本一樣,主要區(qū)別是它通過GetWindowRect取到的坐標(biāo)都是經(jīng)過DWM縮放后的, 無論對方窗口是不是支持DWM虛擬化。

            第二種方式是System DPI aware, 該方式下告訴系統(tǒng), 我的程序會在啟動的顯示器上自己支持DPI aware, 所以不需要對我進(jìn)行DWM 虛擬化。 但是當(dāng)我的程序被拖動到其他DPI不一樣的顯示器時, 請對我們先進(jìn)行system DWM虛擬化縮放。

            第三種方式是Per Monitor DPI aware, 該方式是告訴系統(tǒng), 請永遠(yuǎn)不要對我進(jìn)行DWM虛擬化,我會自己針對不同的Monitor的DPi縮放比率進(jìn)行縮放。

            再介紹下相關(guān)API:
            SetProcessDpiAwareness :設(shè)置當(dāng)前進(jìn)程對高DPi的支持方式
            GetProcessDpiAwareness :查詢某個進(jìn)程對高DPI的支持方式
            GetDpiForMonitor : 獲取某個Monitor的DPI
            WM_DPICHANGED :當(dāng)某個程序窗口被拖到另外一個DPI的Monitor時收到

            最后,簡單總結(jié)下, 從上面我們可以看到微軟在不同操作系統(tǒng)上對高DPI支持的改進(jìn)線路,很多方面也體現(xiàn)了他們對老程序兼容性上的考慮, DWM虛擬化雖然很簡單, 卻丟失了用戶體驗(yàn)。  

            PS, 我在我機(jī)器上測試發(fā)現(xiàn),桌面程序基本上只有微軟自己的程序能做到在高DPI下完美支持, 其他大部分程序(即使如Chrome)也是通過DWM虛擬化實(shí)現(xiàn)的高DPI支持。當(dāng)然現(xiàn)在WPF和Window store App基本上都是內(nèi)置支持高DPI的。

            統(tǒng)計(jì)下, 你們的程序支持高DPI嗎? 

                              High DPI Settings in Windows
            posted on 2014-02-18 23:12 Richard Wei 閱讀(41865) 評論(10)  編輯 收藏 引用 所屬分類: windows desktop

            FeedBack:
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2014-03-03 09:22 | Won
            Vista/Win7 125%與150%的處理方式,應(yīng)該是XP與Vista模式的差別吧  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2014-03-04 19:14 | Richard Wei
            @Won
            確實(shí),DWM虛擬化只有在大于125%時才會自動開啟  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2014-09-14 16:06 | Richard Wei
            有人提到中文中夾雜英文的問題,不多說了,在外企呆過的同學(xué)應(yīng)該都會不自覺地有這個習(xí)慣,并且有時候錯誤的中文還不如用原始的英文。  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)[未登錄]
            2014-10-12 02:09 | gyj
            感謝樓主。  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2014-11-22 21:32 | 好文章
            windows 8下一般只有微軟的應(yīng)用才完美支持hi-dpi的,“云團(tuán)隊(duì)”率先在windows下完美支持hi-dpi設(shè)置,效率高,效果超好,大家可以看看 http://www.17team.cn  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2014-12-16 09:35 | craft
            效果的確不錯,動畫很舒服。  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2015-01-01 23:56 | ibuick
            Windows跟OSX比就是一垃圾貨  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)[未登錄]
            2015-01-12 15:36 | David
            @ibuick
            明明是軟件為了兼容XP用了老舊的庫導(dǎo)致對新系統(tǒng)兼容性爛。。  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2016-02-08 11:01 | Nukepayload2
            看來還是WPF之類的Direct UI有前途,不用管Dpi的事情,總是非常清晰,比例也總是非常協(xié)調(diào)。  回復(fù)  更多評論
              
            # re: 關(guān)于Windows高DPI的一些簡單總結(jié)
            2016-03-22 21:56 | xiabibi
            然而擴(kuò)展顯示器也無法分別設(shè)置不同的縮放級別喝喝了  回復(fù)  更多評論
              
            99国产精品久久| 欧美伊香蕉久久综合类网站| 四虎影视久久久免费| 一个色综合久久| 国产三级久久久精品麻豆三级| 久久r热这里有精品视频| 久久午夜无码鲁丝片午夜精品| 久久久久久国产a免费观看黄色大片 | 久久人人爽人人爽人人爽| 国内精品综合久久久40p| 91精品国产91久久| 亚洲女久久久噜噜噜熟女| 久久久久无码精品| 99999久久久久久亚洲| 亚洲精品综合久久| 久久青青草原精品影院| 怡红院日本一道日本久久| 一本久久综合亚洲鲁鲁五月天| 精品久久久久久国产潘金莲| 亚洲va久久久久| 狠狠精品久久久无码中文字幕 | 精品久久久久久国产免费了| 色欲久久久天天天综合网| 武侠古典久久婷婷狼人伊人| 久久综合综合久久97色| 77777亚洲午夜久久多喷| 亚洲精品乱码久久久久久久久久久久 | 亚洲午夜福利精品久久| 国产精品九九久久免费视频 | 97久久香蕉国产线看观看| 亚洲精品第一综合99久久 | 亚洲av日韩精品久久久久久a | 久久久久久久亚洲Av无码| 中文字幕热久久久久久久| 国产精品亚洲综合久久| 天堂无码久久综合东京热| 久久无码人妻精品一区二区三区 | 精品久久久久久中文字幕人妻最新| 武侠古典久久婷婷狼人伊人| 久久无码精品一区二区三区| 亚洲Av无码国产情品久久|