<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      厚積薄發
      海納百川,有容乃大
      我們知道,關于高DPI的支持, Windows XP時代就開始有了, 那時關于高DPI的支持比較簡單, 但是從Vista/Win7 到現在Win8 /Win8.1, Windows關于高DPI的支持已經發生了很大的變化, 下面我們依次簡單介紹下。

      如果說以前XP時代我們還有理由不關注高DPI,  那么在移動設備時代和大顯示器的高分辨率時代, 我們就沒有理由不關注高DPI了, 比如Surface Pro的分辨率是1920x1080, 這種情況下如果系統我們不設置高DPI, 基本上就沒法觸摸和操作了,所以現在普通程序對高DPI的支持已經成為趨勢了。 

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

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

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

      下面我們看XP是如何對高DPI進行支持的? 

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

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

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

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

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

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

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

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

      這里還有特殊情況也提一下: 我們在高DPI下通過窗口句柄取到的坐標信息是和目標程序是否支持DWM虛擬化相關聯的, 我們對其他支持DWM虛擬化的程序窗口調用GetWindowRect, 取到的坐標也是經過DWM縮放后的坐標; 對禁用DWM虛擬化程序的窗口調用GetWindowRect, 取到的坐標則是沒有經過縮放的原始坐標。

       最后我們再討論下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, 該種方式是告訴系統, 我的程序不支持DPI aware, 請通過DWM虛擬化幫我們實現。 該方式和上面Win7/Win8對高DPI的支持的實現基本一樣,主要區別是它通過GetWindowRect取到的坐標都是經過DWM縮放后的, 無論對方窗口是不是支持DWM虛擬化。

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

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

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

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

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

      統計下, 你們的程序支持高DPI嗎? 

                        High DPI Settings in Windows
      posted on 2014-02-18 23:17  Richard Wei  閱讀(12551)  評論(3)    收藏  舉報

      主站蜘蛛池模板: 亚洲精品一二三四区| gogo无码大胆啪啪艺术| 亚洲日韩精品无码一区二区三区| 国产在线啪| V一区无码内射国产| 无码精品人妻一区二区三区中| 国产福利酱国产一区二区| 熟女人妻aⅴ一区二区三区电影| 夜夜躁狠狠躁2021| 99国产精品一区二区蜜臀| 制服丝袜美腿一区二区| 国产综合久久99久久| 精品无码一区二区三区电影| 日韩亚洲欧美中文高清| 国产超碰无码最新上传| 日日碰狠狠添天天爽| 视频一区二区三区四区久久| 国产麻豆成人传媒免费观看| 深夜视频国产在线观看| 韩国 日本 亚洲 国产 不卡| 天天做天天爱夜夜爽女人爽| 91老肥熟女九色老女人| 国产成人精品一区二区三区无码 | 日本高清在线观看WWW色| 扒开粉嫩的小缝隙喷白浆视频| 免费看欧美全黄成人片| 中文字幕一区二区精品区| 四川少妇被弄到高潮| 国产在线一区二区在线视频| 亚洲成人av在线资源| 亚洲人亚洲人成电影网站色| 精品久久久久久国产| 国产精品一区中文字幕| 天堂av成人网在线观看| 国产国拍亚洲精品永久软件| 成人一区二区不卡国产| 亚洲av成人网在线观看| 精品视频福利| 国产精品白浆无码流出| 七台河市| 欧美国产日产一区二区|