青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

最近的工作是給開源的DUILib支持Accessibility, 一些經驗記錄并分享下。

微軟的Accessibility其實Windows平臺上一個挺重要的東西, 盡管在國內不受重視,但是如果你的軟件要出口歐美,Accessibility是必須的, 不然國外正規單位(政府,學校,大公司等)是禁止采購的。

如果我們的軟件用的是Winodws標準控件,一般Accessibility是系統默認內置支持的 (當然這也不是一定的,據我測試系統的Date Time Picker控件是不支持MSAA的)。因為系統標準控件在展現和行為上的一些限制以及自繪的復雜性,越來越多的軟件使用DirectUI技術,關于使用DirectUI的理由,更多參見<<如何讓窗口控件半透明>>和<<軟件換膚的原理>>.

國內最有名的的DirectUI界面庫當然是開源的DUILib (盡管這套庫已停止更新), 實際上我以前在自己業余寫點東西時, 也參考過它, 具體參見<<開源一套DirectUI界面庫>>。對于開源的DUILib, 個人覺得它有挺多優點, 也有挺多缺點, 我們重點說缺點, 因為這是我們改進的方向。

1。擴展性差
    DUILib只實現了一些基本的控件,好的DirectUI庫可以通過基本控件組合來輕松實現復雜控件,而要達到這個效果, 很多時候我們需要攔截子控件的消息, 盡管DUILib提供了delegate機制來子類化子控件, 但是這樣消息攔來攔去實在太不方便了,很多時候自己都轉暈了。個人覺的這里我們可以引入WPF的隧道和冒泡機制, 這個東西對DirectUI界面庫實在太重要了。

2。不支持Layered窗口
要完美支持Layered窗口,意味著所有的Render全都要支持Alpha通道, DUILib使用GDI, 如果沒有特殊處理,意味著沒法完美支持Layered窗口, 我這篇也談到過這個問題<<如何基于純GDI實現alpha通道的矢量和文字繪制>>。

3。大數據時性能不行
DUILib很多時候只適合做些簡單的界面,本身控件基類很龐大,數據量方面對于幾百條數據還行,但是對于成千上萬條數據就吃不消了,這時我們需要引入WPF的虛表機制。

4。不支持圖文排版
盡管DUILib支持簡單的HTML排版, 但是畢竟太簡單,如果我們要在QQ那樣的聊天窗口里引入就吃不消了, 另外它渲染HTML那個代碼我是吃不消看的。

5. 基本不支持Accessibility

6。其他
接口和屬性定義太隨意, 采用導出類的方式也不好擴充, 渲染方面最好能在GDI/GDI+/Direct2D方面進行切換,最好將核心控件和擴展控件分離開, 編輯器也太簡陋。

今天我們重點說Accessibility,一個界面庫要完整支持Accessibility, 要包括太多東西 (具體可以參見控制面板里的"輕松訪問中心"),我估計只有微軟自己做的到(比如WPF),這也是很多人推薦系統標準控件而排斥DirectUI的理由。我們說的Accessibility很多時候只是簡化版, 下面我們說重點的幾條。

1。鍵盤支持
鍵盤支持簡單來說就是即使我沒有鼠標, 我也能通過通過鍵盤完成所有操作。它主要包括鍵盤導航和控件的鍵盤支持。鍵盤導航主要是指我可以通過一些熱鍵(如F6)可以在不同窗口(Panel)之間進行焦點切換, 我可以通過Tab/Shift+Tab在窗口內不同控件之間進行焦點導航。控件的鍵盤支持也是很多國內DirectUI庫所缺失的,比如:
Dialog: Enter執行默認, ESC退出并關閉
Button:空格執行
CheckBox:空格取反
Radio:空格取反,上下左右鍵切換選中項
TabCtrl:焦點選中時上下左右切換, 焦點沒選中時Ctrl+Tab/Ctrl+Tab+Shift切換Tab頁
Menu:上下左右導航,Enter執行, ESC取消關閉, 具體參見<<DirectUI中模態對話框和菜單的原理>>
....
總之,DUILib在鍵盤支持這塊已經做了不少工作,但是還有挺多事要做,每個控件都要完整支持鍵盤是個很精細的活。

2。讀屏軟件和自動化測試的支持。 
ScreenReader(讀屏器)主要是給盲人用的, 程序可以實時的把獲得焦點的控件和系統發生的事件播報出來, 很多讀屏軟件都需要收費,還好Win7之后系統已自帶讀屏軟件(控制面板\輕松訪問\輕松訪問中心\啟動講述人)。自動化測試時也需要工具能夠理解我們界面中包含的元素類型和位置, 以及模擬操作事件等。

DirectUI要支持讀屏和自動化測試一般有2種方式, MSAA和UI Automation。 MSAA是比較古老的方式,主要就是實現IAccessible接口;UI Automation是微軟特意給WPF新增加的。MSAA出來的時候還是Win95, 因為歷史原因有一些限制, 比如不支持Text控件,沒法描述復雜控件等, 所以微軟后來引入了UI Automation, 具體參見<<Windows GUI自動化測試技術的比較和展望>>。 

MSAA最大的優點是穩定, 所以我在DUILib里采用MSAA來實現ScreenReader的支持。簡單說下幾個關鍵點:
(a) 每個控件啊實現IAccessible接口的Proxy對象盡量獨立,里面保存一個控件指針的引用,這樣即使控件銷毀了,Proxy對象可以依舊存在(系統仍可能會訪問這個對象)。
(b) 按照控件的層次體系,實現每種控件的Proxy類(實現IAccessible接口)。
(c) WM_GETOBJECT請求OBJID_CLIENT時返回根節點的Proxy對象, 焦點變化時通知觸發事件NotifyWinEvent(EVENT_OBJECT_FOCUS, m_hWndPaint, (LPARAM)m_pFocus, CHILDID_SELF), 窗口收到WM_GETOBJECT消息時根據ObjectID(這里是控件指針)找到該控件, 然后返回該控件的Proxy。 (這是關鍵,這個問題郁悶了我好久的...) 

3。高對比(high contrast)的支持
高對比,主要是給色盲用,這個東西一般自繪程序都不會支持, 即使你是用標準控件,因為一般會用自己漂亮的圖片和色彩來表現界面, 高對比實現的關鍵點是你在畫每個元素時要通過GetSystemColor來獲取顏色。據我測繪除了微軟自己的程序, 其他越是漂亮的軟件越是不支持高對比(即使如QQ和Chrome)。

4。高DPI的支持
隨著Surface Pro和高分辨率設備的流行,程序對高DPI的支持正變得越來越重要, 具體參見<<關于Windows高DPI的一些簡單總結>>。傳統的基于標準控件的程序要支持高DPI是在太難了,所以微軟才有了DWM虛擬化。但是DirectUI對高DPI的支持有著天然的優勢, 我們完全可以在界面庫這層讓程序完美支持高DPI, 界面的渲染主要是文字,矢量和圖片, 文字和矢量完全可以通過無損縮放繪畫實現,圖像可以通過適當縮放和換圖來實現。

總結下,盡管我N次吐槽基于GDI的DirectUI界面庫會隨著XP的淡出而逐漸失去市場, 但是實際工作中還是要經常和GDI打交道,外面招聘單位還是有不少Windows客戶端的開發崗位。 在這"移動互聯和"Web前端"橫行的"大數據"時代,很多同事開始向移動App和大數據轉型, 盡管這幾年PC客戶端的開發人員是只出不進, 但是只要Windows存在一天,我們的工作就還是有價值的..
posted on 2014-11-15 00:01 Richard Wei 閱讀(8393) 評論(7)  編輯 收藏 引用 所屬分類: windows desktop

FeedBack:
# re: 如何給開源的DUILib支持Accessibility
2014-11-15 10:19 | 歌詞
來看看支持一下~  回復  更多評論
  
# re: 如何給開源的DUILib支持Accessibility
2014-11-17 14:35 | 臉上長粉刺是什么原因
挺好的,謝謝樓主的分享  回復  更多評論
  
# re: 如何給開源的DUILib支持Accessibility
2014-11-18 19:12 | WXX
如果真的要這么玩,不如往大了玩,看看 chromium 的 views。  回復  更多評論
  
# re: 如何給開源的DUILib支持Accessibility
2014-12-17 14:33 | bukebushuo
讀屏那個應該不太可能了,dui本身就是一個無句柄方式的界面,與原先的訪問機制完全不一樣了(主要是獲取控件指針的方式,原先按點坐標可以獲取控件窗口句柄,現在不行了),給控件加上你說的那個機制也達不到目的,除非是針對dui的界面寫專門的訪問接口,但是那樣的話,就不算通用方法了吧?
控件加鍵盤支持應該是最簡單的,只要響應下鍵盤消息就可以了,沒啥麻煩的,幾行代碼的事  回復  更多評論
  
# re: 如何給開源的DUILib支持Accessibility
2014-12-17 14:42 | Richard Wei
@bukebushuo
不知道老弟的界面庫賣的怎么樣了。

DUI支持讀屏我已經做了, 就按我上面說的方法。
實際上QQ的界面庫也是支持讀屏的,有興趣的話可以在win7/win8上嘗試 “控制面板\輕松使用\輕松使用設置中心\啟動講訴人”, 然后在QQ上通過Tab切換控件焦點。  回復  更多評論
  
# re: 如何給開源的DUILib支持Accessibility
2015-09-09 19:53 | longjoy
@Richard Wei
duilib支持MSAA了?不知道哪里可以下載到

正準備用DUILIB,苦于不支持自動化,發愁Ing  回復  更多評論
  
# re: 如何給開源的DUILib支持Accessibility
2015-09-09 20:14 | Richard Wei
@longjoy
按我上面說的做就可以了支持了,公司內部代碼,外面應該下載不到...  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美风情在线观看| 国产精品免费观看在线| 欧美成人精精品一区二区频| 一区二区三区欧美视频| 国内精品久久国产| 欧美性色综合| 欧美精品久久久久久久久老牛影院| 亚洲一区二区三区中文字幕在线 | 亚洲欧洲在线视频| 欧美激情国产日韩精品一区18| 欧美在线3区| 一本色道精品久久一区二区三区| 狠狠色2019综合网| 亚洲国产99精品国自产| 国语精品一区| 欧美人与性动交cc0o| 国产精品国内视频| 国产精品你懂的在线欣赏| 国产精品有限公司| 国产日韩欧美在线播放不卡| 国产欧美韩日| 亚洲经典三级| 日韩天堂av| 羞羞答答国产精品www一本| 午夜精品一区二区三区电影天堂| 亚洲性感美女99在线| 狂野欧美激情性xxxx欧美| 久久激情综合| 欧美国产日本在线| 亚洲在线国产日韩欧美| 亚洲欧美视频在线观看视频| 看欧美日韩国产| 免费日韩成人| 欧美日韩a区| 伊人春色精品| 99国产精品一区| 麻豆视频一区二区| 亚洲精品在线视频观看| 亚洲欧美在线免费观看| 欧美大片免费观看在线观看网站推荐| 欧美激情中文字幕一区二区| 国产一区二区三区的电影| 亚洲国产精品传媒在线观看| 在线观看精品一区| 久久不射2019中文字幕| 欧美福利一区二区三区| 午夜精品美女自拍福到在线| 狂野欧美激情性xxxx| 欧美日韩成人综合| 91久久中文| 欧美在线观看一区二区| 亚洲丝袜av一区| 久久久亚洲国产天美传媒修理工| 欧美激情精品久久久久久久变态| 黑人极品videos精品欧美裸| 日韩视频免费观看高清在线视频| 国产亚洲a∨片在线观看| 亚洲精品韩国| 久久综合久久综合久久综合| 午夜视黄欧洲亚洲| 欧美日韩精品在线| 日韩一本二本av| 亚洲深夜福利| 欧美成年视频| 欧美一区二区日韩| 欧美一区网站| 亚洲国产精品久久| 午夜精品成人在线| 另类尿喷潮videofree| avtt综合网| 欧美日韩免费观看一区| 亚洲国产精品悠悠久久琪琪| 欧美国产欧美综合| 久久免费国产精品| 国产精品中文在线| 久久久久久久久久久一区| 亚洲精品国精品久久99热一| 另类天堂av| 在线观看福利一区| 久久亚洲影音av资源网| 久久先锋资源| 永久域名在线精品| 欧美成人国产| 老色批av在线精品| 亚洲国产欧美精品| 一本色道久久88亚洲综合88| 欧美日韩国产一级| 欧美在线二区| 亚洲欧美日韩系列| 欧美日韩在线观看一区二区三区| 亚洲影视在线| 亚洲一区一卡| 亚洲第一黄网| 欧美国产在线视频| 性欧美精品高清| 国产亚洲欧洲一区高清在线观看| 久久精品国产成人| 性色av一区二区三区在线观看| 激情五月综合色婷婷一区二区| 久久国产精品一区二区三区| 午夜在线视频观看日韩17c| 亚洲国产一区二区三区a毛片| 欧美大片在线影院| 国产精品高精视频免费| 欧美在线视频观看| 亚洲一区日韩在线| 91久久久久久国产精品| 亚洲精品视频一区| 狠狠色噜噜狠狠狠狠色吗综合| 久久天堂精品| 国产精品电影在线观看| 久久久久久电影| 欧美xxx在线观看| 久久久91精品| 欧美精品粉嫩高潮一区二区| 久久亚洲精品欧美| 欧美精品一区二| 亚洲最黄网站| 久久字幕精品一区| 亚洲视频大全| 欧美激情一区二区在线 | 亚洲在线1234| 午夜欧美不卡精品aaaaa| 亚洲国产成人久久综合| 久久午夜电影| 亚洲国产黄色片| 一区二区毛片| 1024成人| 亚洲一级影院| 亚洲无玛一区| 久久久久高清| 久久久久国产精品人| 欧美日韩国产精品| 亚洲国产三级网| 狠狠久久亚洲欧美专区| 亚洲男人的天堂在线aⅴ视频| 亚洲狠狠丁香婷婷综合久久久| 亚洲片国产一区一级在线观看| 亚洲电影免费观看高清完整版在线 | 国产精品你懂的在线欣赏| 欧美不卡视频| 91久久精品www人人做人人爽| 亚洲视频专区在线| 亚洲欧美日韩一区二区| 欧美成人蜜桃| 欧美在线黄色| 国产精品嫩草久久久久| 亚洲欧洲精品成人久久奇米网| 亚洲国产精品va在看黑人| 亚洲欧美日韩综合aⅴ视频| 一本一本久久| 欧美精品 日韩| 久久精品系列| 国产欧美一区二区在线观看| 小辣椒精品导航| 亚洲专区在线视频| 欧美日韩中文在线观看| 中文精品99久久国产香蕉| 99精品国产在热久久| 欧美日韩中文另类| 日韩视频不卡中文| 亚洲欧美一区二区原创| 国产精品久久毛片a| 中文日韩在线| 久久久一本精品99久久精品66| 国产欧美短视频| 美日韩精品免费| 欧美电影电视剧在线观看| 亚洲精品综合| 欧美日韩国产成人精品| 美女露胸一区二区三区| 亚洲乱码国产乱码精品精| 每日更新成人在线视频| 一区二区三区久久久| 亚洲欧美日韩一区二区在线 | 国产日产高清欧美一区二区三区| 久久动漫亚洲| 美女露胸一区二区三区| 亚洲一区二区久久| 欧美日韩国产123区| 亚洲欧美日韩另类| 久久综合色一综合色88| 日韩视频一区二区三区| 日韩亚洲一区在线播放| 国产色产综合产在线视频| 亚洲一区二区三区中文字幕 | 亚洲黄一区二区| 欧美精品久久天天躁| 一区二区三区黄色| 久久精品综合网| 激情成人亚洲| 欧美黄色一区二区| 999亚洲国产精| 亚洲剧情一区二区| 欧美激情网站在线观看| 亚洲四色影视在线观看| 牛夜精品久久久久久久99黑人| 日韩午夜视频在线观看| 国产精品一区二区久久久| 久久亚洲电影|