最近的工作是給開源的DUILib支持Accessibility, 一些經(jīng)驗(yàn)記錄并分享下。
微軟的Accessibility其實(shí)Windows平臺(tái)上一個(gè)挺重要的東西, 盡管在國內(nèi)不受重視,但是如果你的軟件要出口歐美,Accessibility是必須的, 不然國外正規(guī)單位(政府,學(xué)校,大公司等)是禁止采購的。
如果我們的軟件用的是Winodws標(biāo)準(zhǔn)控件,一般Accessibility是系統(tǒng)默認(rèn)內(nèi)置支持的 (當(dāng)然這也不是一定的,據(jù)我測(cè)試系統(tǒng)的Date Time Picker控件是不支持MSAA的)。因?yàn)橄到y(tǒng)標(biāo)準(zhǔn)控件在展現(xiàn)和行為上的一些限制以及自繪的復(fù)雜性,越來越多的軟件使用DirectUI技術(shù),關(guān)于使用DirectUI的理由,更多參見<<如何讓窗口控件半透明>>和<<軟件換膚的原理>>.
國內(nèi)最有名的的DirectUI界面庫當(dāng)然是開源的DUILib (盡管這套庫已停止更新), 實(shí)際上我以前在自己業(yè)余寫點(diǎn)東西時(shí), 也參考過它, 具體參見<<開源一套DirectUI界面庫>>。對(duì)于開源的DUILib, 個(gè)人覺得它有挺多優(yōu)點(diǎn), 也有挺多缺點(diǎn), 我們重點(diǎn)說缺點(diǎn), 因?yàn)檫@是我們改進(jìn)的方向。
1。擴(kuò)展性差
DUILib只實(shí)現(xiàn)了一些基本的控件,好的DirectUI庫可以通過基本控件組合來輕松實(shí)現(xiàn)復(fù)雜控件,而要達(dá)到這個(gè)效果, 很多時(shí)候我們需要攔截子控件的消息, 盡管DUILib提供了delegate機(jī)制來子類化子控件, 但是這樣消息攔來攔去實(shí)在太不方便了,很多時(shí)候自己都轉(zhuǎn)暈了。個(gè)人覺的這里我們可以引入WPF的隧道和冒泡機(jī)制, 這個(gè)東西對(duì)DirectUI界面庫實(shí)在太重要了。
2。不支持Layered窗口
3。大數(shù)據(jù)時(shí)性能不行
DUILib很多時(shí)候只適合做些簡單的界面,本身控件基類很龐大,數(shù)據(jù)量方面對(duì)于幾百條數(shù)據(jù)還行,但是對(duì)于成千上萬條數(shù)據(jù)就吃不消了,這時(shí)我們需要引入WPF的虛表機(jī)制。
4。不支持圖文排版
盡管DUILib支持簡單的HTML排版, 但是畢竟太簡單,如果我們要在QQ那樣的聊天窗口里引入就吃不消了, 另外它渲染HTML那個(gè)代碼我是吃不消看的。
5. 基本不支持Accessibility
6。其他
接口和屬性定義太隨意, 采用導(dǎo)出類的方式也不好擴(kuò)充, 渲染方面最好能在GDI/GDI+/Direct2D方面進(jìn)行切換,最好將核心控件和擴(kuò)展控件分離開, 編輯器也太簡陋。
今天我們重點(diǎn)說Accessibility,一個(gè)界面庫要完整支持Accessibility, 要包括太多東西 (具體可以參見控制面板里的"輕松訪問中心"),我估計(jì)只有微軟自己做的到(比如WPF),這也是很多人推薦系統(tǒng)標(biāo)準(zhǔn)控件而排斥DirectUI的理由。我們說的Accessibility很多時(shí)候只是簡化版, 下面我們說重點(diǎn)的幾條。
1。鍵盤支持
鍵盤支持簡單來說就是即使我沒有鼠標(biāo), 我也能通過通過鍵盤完成所有操作。它主要包括鍵盤導(dǎo)航和控件的鍵盤支持。鍵盤導(dǎo)航主要是指我可以通過一些熱鍵(如F6)可以在不同窗口(Panel)之間進(jìn)行焦點(diǎn)切換, 我可以通過Tab/Shift+Tab在窗口內(nèi)不同控件之間進(jìn)行焦點(diǎn)導(dǎo)航。控件的鍵盤支持也是很多國內(nèi)DirectUI庫所缺失的,比如:
Dialog: Enter執(zhí)行默認(rèn), ESC退出并關(guān)閉
Button:空格執(zhí)行
CheckBox:空格取反
Radio:空格取反,上下左右鍵切換選中項(xiàng)
TabCtrl:焦點(diǎn)選中時(shí)上下左右切換, 焦點(diǎn)沒選中時(shí)Ctrl+Tab/Ctrl+Tab+Shift切換Tab頁
....
總之,DUILib在鍵盤支持這塊已經(jīng)做了不少工作,但是還有挺多事要做,每個(gè)控件都要完整支持鍵盤是個(gè)很精細(xì)的活。
2。讀屏軟件和自動(dòng)化測(cè)試的支持。
ScreenReader(讀屏器)主要是給盲人用的, 程序可以實(shí)時(shí)的把獲得焦點(diǎn)的控件和系統(tǒng)發(fā)生的事件播報(bào)出來, 很多讀屏軟件都需要收費(fèi),還好Win7之后系統(tǒng)已自帶讀屏軟件(控制面板\輕松訪問\輕松訪問中心\啟動(dòng)講述人)。自動(dòng)化測(cè)試時(shí)也需要工具能夠理解我們界面中包含的元素類型和位置, 以及模擬操作事件等。
DirectUI要支持讀屏和自動(dòng)化測(cè)試一般有2種方式, MSAA和UI Automation。 MSAA是比較古老的方式,主要就是實(shí)現(xiàn)IAccessible接口;UI Automation是微軟特意給WPF新增加的。MSAA出來的時(shí)候還是Win95, 因?yàn)闅v史原因有一些限制, 比如不支持Text控件,沒法描述復(fù)雜控件等, 所以微軟后來引入了UI Automation, 具體參見<<Windows GUI自動(dòng)化測(cè)試技術(shù)的比較和展望>>。
MSAA最大的優(yōu)點(diǎn)是穩(wěn)定, 所以我在DUILib里采用MSAA來實(shí)現(xiàn)ScreenReader的支持。簡單說下幾個(gè)關(guān)鍵點(diǎn):
(a) 每個(gè)控件啊實(shí)現(xiàn)IAccessible接口的Proxy對(duì)象盡量獨(dú)立,里面保存一個(gè)控件指針的引用,這樣即使控件銷毀了,Proxy對(duì)象可以依舊存在(系統(tǒng)仍可能會(huì)訪問這個(gè)對(duì)象)。
(b) 按照控件的層次體系,實(shí)現(xiàn)每種控件的Proxy類(實(shí)現(xiàn)IAccessible接口)。
(c) WM_GETOBJECT請(qǐng)求OBJID_CLIENT時(shí)返回根節(jié)點(diǎn)的Proxy對(duì)象, 焦點(diǎn)變化時(shí)通知觸發(fā)事件NotifyWinEvent(EVENT_OBJECT_FOCUS, m_hWndPaint, (LPARAM)m_pFocus, CHILDID_SELF), 窗口收到WM_GETOBJECT消息時(shí)根據(jù)ObjectID(這里是控件指針)找到該控件, 然后返回該控件的Proxy。 (這是關(guān)鍵,這個(gè)問題郁悶了我好久的...)
3。高對(duì)比(high contrast)的支持
高對(duì)比,主要是給色盲用,這個(gè)東西一般自繪程序都不會(huì)支持, 即使你是用標(biāo)準(zhǔn)控件,因?yàn)?/span>一般會(huì)用自己漂亮的圖片和色彩來表現(xiàn)界面, 高對(duì)比實(shí)現(xiàn)的關(guān)鍵點(diǎn)是你在畫每個(gè)元素時(shí)要通過GetSystemColor來獲取顏色。據(jù)我測(cè)繪除了微軟自己的程序, 其他越是漂亮的軟件越是不支持高對(duì)比(即使如QQ和Chrome)。
4。高DPI的支持
隨著Surface Pro和高分辨率設(shè)備的流行,程序?qū)Ω逥PI的支持正變得越來越重要, 具體參見<<關(guān)于Windows高DPI的一些簡單總結(jié)>>。傳統(tǒng)的基于標(biāo)準(zhǔn)控件的程序要支持高DPI是在太難了,所以微軟才有了DWM虛擬化。但是DirectUI對(duì)高DPI的支持有著天然的優(yōu)勢(shì), 我們完全可以在界面庫這層讓程序完美支持高DPI, 界面的渲染主要是文字,矢量和圖片, 文字和矢量完全可以通過無損縮放繪畫實(shí)現(xiàn),圖像可以通過適當(dāng)縮放和換圖來實(shí)現(xiàn)。
總結(jié)下,盡管我N次吐槽基于GDI的DirectUI界面庫會(huì)隨著XP的淡出而逐漸失去市場(chǎng), 但是實(shí)際工作中還是要經(jīng)常和GDI打交道,外面招聘單位還是有不少Windows客戶端的開發(fā)崗位。 在這"移動(dòng)互聯(lián)和"Web前端"橫行的"大數(shù)據(jù)"時(shí)代,很多同事開始向移動(dòng)App和大數(shù)據(jù)轉(zhuǎn)型, 盡管這幾年P(guān)C客戶端的開發(fā)人員是只出不進(jìn), 但是只要Windows存在一天,我們的工作就還是有價(jià)值的..
posted on 2014-11-15 00:01
Richard Wei 閱讀(8405)
評(píng)論(7) 編輯 收藏 引用 所屬分類:
windows desktop