小弟最近研究介面實現技術,過年也沒閑著,google了整個網路。弄介面也弄了幾年了,做比較炫的介面,也沒什麼問題。最近公司年後要啟動一個項目,項目非常複雜(一套賣幾百萬),要使用文檔/視圖結構,但一定要做深層次美化。以前一直用mfc做介面,使用gdi或gdi+貼圖,用ini或xml配置介面。常用控制項的美化也實現了好幾年了,都比較穩定,個別特殊控制項,實現一下也沒什麼問題,由於這個項目周期很長(兩年多),正好借新項目,好好總結一下目前比較常見的介面開發技術。今天先總結一下windowless的致命缺點,過兩天總結它的優點,和其它技術的優缺點。再提一句,我們的項目是使用wpf開發,也是windowless,但與我下面所說的windowless是兩回事。
windowless或者稱handleless,也就是無控制代碼視窗,在設計和實現的時候,每個控制項都自己實現,最後畫到父視窗中。另一個偽windowless是用標準mfc控制項,然後通過hook或其它遠程線程注入等技術,讓spy++等軟體,看不到視窗控制代碼。這主要是為了防止盜號木馬通過edit視窗控制代碼,盜取使用者名稱和密碼。好了,費話少說,下面是小弟總結的windowless的缺點,如果要使用這類介面開發技術,要麼有原始碼,要麼是自己公司實現的,否則風險非常大。
1、無視窗控制代碼,所有您以前關於“視窗”概念的知識都白學了。您將不可能使用::ShowWindow(hWnd, SW_HIDE)來隱藏一個視窗,也不能使用::MoveWindow來移動一個視窗。
2、所有您以前學習的關於“訊息”的知識也作廢了。您不可能使用::SendMessage(m_hWnd, WM_SETTEXT, 0, (LPARAM)_T("Hello world"));來設定視窗標題。
3、如果您的程式已經寫好,需要花費比開發程式還要長的時間來移值到DirectUI介面上。
4、重新學習一套系統介面和概念,如果不是國際知名的大公司的windowless產品、這些知識對您的職業生涯沒有太多好處,反而浪費了您的時間。
5、如果不是國際知名公司的產品,產品的穩定性和可發展性無法保證。
6、如果您的功能層代碼需要與UI層互動,例如,要向UI視窗發送訊息,那麼您的功能層代碼也要做相應的修改,所以windowless類的介面庫,不僅僅影響UI層,還影響功能層。
7、視窗的剪裁、啟用、繪製、訊息迴圈等等全部需要類比。
8、除了極個別程式,全球幾乎所有軟體產品都使用win32布局方式,無論在技術儲備,相容性和獲得協助方面,標準視窗觀念都有得天獨厚的優勢。
9、無法對編譯好的exe進行後期漢化、編寫外掛程式等常規操作。運行中的程式也無法響應其它程式發來的標準訊息,例如隱藏控制項、設定控制項文本等。
10、不支援MFC的文檔/視圖架構。
綜上、windowless比傳統win32視窗樹形結構有很多局限性和不確定性。