1,MFC 基於VC6.0的微軟基礎庫 2,WPF 做絢麗界面一律用WPF,做一般絢麗界面用WinForm,做windows標准界面用MFC WPF也有個致命缺點,就是要.net framework支持 3,DirectUI Windowsless或者Handleless,也就是無句柄窗口 4,迅雷界面引擎 http://xldoc.xl7.xunlei.com/ 迅雷7應用開發在線文檔 Thunder7 XAP 界面引擎 迅雷下載開放引擎 迅雷基礎庫 5,網上討論 /////////////////////////////////////////////////// (1)windowless或者稱handleless,也就是無句柄窗口,在設計和實現的時候,每個控件都自己實現,最后畫到父窗口中。另一個偽windowless是用標准mfc控件,然后通過hook或其它遠程線程注入等技術,讓spy++等軟件,看不到窗口句柄。這主要是為了防止盜號木馬通過edit窗口句柄,盜取用戶名和密碼。 (2)windowless 或 handleless 或 DirectUI 技術,將首選 WGI !WGI 后生可畏,將是永遠的經典! http://code.google.com/p/oic-wgi/downloads/list 基於C語言 (3)qq和msn都是windowless方式 (4)windowless技術並不是適用所有的軟件界面。這一點還需要開發者自已分清楚。
就目前來講windowless比較適用於基於對話框的應用程序。 (5)DirectUI是目前windows平台上最流行的一種無窗口界面技術 顯然是最不流行的技術,使用無句柄方式的軟件,只是鳳毛麟角。 所有控件都是虛擬控件沒有實際窗口,因此效率更高,更安全。 這個有什么必然聯系嗎?為什么效率會高呢?安全性更是無從談起呀。用windowless就安全?
國內流行的QQ/MSN/迅雷等都采用此種技術 這個說對了。但是,msn雖然沒有窗口句柄,但是有另一種句柄,為此,軟件還做了類似spy++的工具來獲得這個句柄 (6)界面開發主要解決的問題是:如何把美工的創意,更方便的用代碼實現。或者,界面開發技術限制了哪些美術創意的實現? (7)感覺windowless,DirectUI這種技術,只有這種大公司才有能力搞。 聽說QQ 搞這個東西都搞了快5年了,開發投入超千萬。
感覺這種東西要做出通用的太難了 你看QQ的所有軟件,也不是所有的軟件都是這種windowless的。 微軟的就不用說了,在msn,xp里面有些部分應用。
我猜測他們做的這個東西,雖然可以用了,但內部沒有全部推廣使用。原因可能是還不夠通用,還不夠成熟。 (8)微軟是因為內部太多界面庫了。各個部門各用各的。
QQ這種,純粹是為了自己產品服務的,人家也不會賣自己的庫,所以不需要通用。自已的產品需要什么控件,就往庫里開發什么控件。 (9)windowless作為一種新的界面技術,當然要重新實現Win32界面原來的提供的機制了, 窗口的剪裁、激活、繪制、消息循環,每一個新的界面機制都要自己實現這些東西的, 這怎么算致命的缺點呢?
我個人還是很喜歡windowless的界面機制的,非常自由,開發者可以天馬行空的實現自己的想法創意, 傳統的win32架構界面開發總有種帶着鐐銬跳舞的感覺。 (10)windowless可以增加破解外掛的難度,也就是增加了破解的門檻,不是隨便會弄個對話框程序就可以破解,但還是不能根本解決問題,QQ登錄密碼,一樣可以拿到。 (11)wpf慢死你~學那么多技術干嘛,學好win32就可以了。wpf過幾年沒了,就出來了fpw了 (12)從CWnd直接派生,也可以天馬行空的實現自己的想法創意。並且在實現創意是,不用考慮另人頭痛的剪裁、焦點、消息循環等等與界面不相關的東東。 (13)wpf與我討論的windowless不是一個概念。 我說的windowless,是指咱們普通人或一般公司開發的。wpf也是windowless,當然不致命,也不是缺點了。並且大部分界面編程的人,都應該學學的。你學習一個小公司內部的windowless產品,說句不好聽的,跳槽也不好找工作,當然,如果你是這個windowless產品的設計者,那你還是很吃香的。wpf雖然已經誕生很多年了,但國內到現在依然沒有普及,那是因為xp現在還占據大部分人的桌面,學習wpf,會有更多工作機會。我考查了部分windowless產品,包括號稱輕量化wpf的windowless的產品,離wpf相去甚遠,wpf中的數據綁定、布局、資源、事件、動畫、3D等等核心或非核心技術,統統沒有。 (14)其實樓主說了這么多,無非就是一點:“windows做完這一整套東西已經是相當大的工作量,大家再重新開發完全得不償失而且難以達到Windows gui的穩定性”。 但在看來,Windows那套框架由於開發的年代太久,很多概念太落后了。各種元素的復用性太差。這點和swing對比就知道。所以自己開發Windowless的好處就是鍛煉自己的構架能力。 不過我還是比較同意樓主的觀點。要想寫成Windows那么穩定的gui,要相當大的耐心和工作量。 而樓主贊同wpf,我不敢苟同,具體可見:http://topic.csdn.net/u/20110125/14/4702420d-8d03-46cb-99a7-8001771e2127.html?62503 里面有段話很經典:“第五個問題是慢,驚人的慢。大家可以看看“飛信”,這是一個微軟控主導決策的,嗯,使用.net 2.0。為了解決程序發布的問題,專門弄了個微型的.net框架,但是你將它與QQ比,是不是覺得慢得太多?持續多年以后,移動的先生們不耐煩了,才有的現在的基於C++的原生版本,請比較一下速度。這里特別提醒一下,飛信的開發,是中國移動投入巨資、得到微軟中國整個團隊無微不至的支持的,這些高人甚至赤膊上陣親自動手,這樣使用他們的開發工具,歷時數年也不過是做出一個被淘汰的產品。先生,請掂量一下,你比他們這些家伙更厲害嗎?你比孩子的母親對孩子更了解嗎?” (15)如果需要文檔/視圖的話,還是用mfc好了,現在mfc很漂亮了,像office2007。 vs2010貌似wpf做的,恩 確實佩服。 不知道office2010是怎么做的。
緊跟大公司新技術吧,要不就找個認為設計的好的開源項目,一直用、一直改。不過跟着大公司走還是最好的選擇吧 (16)丟一個這東西出來好了。 http://www.viksoe.dk/code/windowless1.htm 雖然這東西的模型設計的我不太喜歡,不過絕對是學習的好材料。而且本身也非常美觀,這是gdi做的windowsless。 (17)我其實把mfc和windowless都歸到win32技術體系的,實現上windowless也是用mfc開發,只不過不使用它默認的CButton等這些控件,仍然使用GDI或GDI+等技術來繪制。正如你說的,這個體系有點久遠,所以微軟設計了wpf,來逐步代替win32。到目前為止wpf還是不成功的。但我堅信,遲早一天會成功的。wpf開發的產品,體積又大,運行速度又慢,是制約它發展的最大瓶頸。不過vs2010采用wpf開發后,發現,像vs2010這么大規則的項目,其實運行速度已經很快了,不比vs2008差多少。或許microsoft做過優化? (18)到討論成這樣了,那gtk,qt這類的怎么活啊.
我也拋一個出來,娛樂一下 Nana C++ Library http://stdex.sourceforge.net (19)嘿嘿, 我喜歡GTK。 見到看到一篇文:Qt vs GTK
另外, VS2010中,MFC已經做了大量的擴充,可以做出漂亮的界面的 (20)如果非要用Direct UI做項目,從研發成本考慮,還不如直接花錢買一套UI庫,我看這個公司的就不錯:http://www.directui.com/,所有的控件全部用接口的形式訪問。 (21)對微軟來說,做一個NATIVE-WPF易如反掌。蔣晟大大也說過,微軟內部也討論過這個問題,不過最終放棄了。這個可以理解,WPF是.NET的殺手鐧,如果把這個殺手鐧轉交給非托管語言,對.NET戰略是致命的。我還真想知道,如果沒有WPF,還有多少人會選擇.NET。討論這個沒有意義。
還是回到windowless吧。近幾年很多人關注DirectUI/Windowless,卻不知DirectUI為何物。我曾經在某個帖子里面做過比喻:DirectUI = Window + Windowless,所有在屏幕上顯示的東西都是DirectUI方式,3D是,瀏覽器是,連普通窗口也是,大家都在顯存的同一塊區域顯示所有內容,哪里分什么有窗口無窗口。為什么要把窗口分成有句柄和無句柄呢?因為微軟的有句柄窗口是工業標准,操作方式有章可循,窗口API大家耳熟能詳,家家戶戶都用沒有鎖的門窗,所有人都知道該怎么操作窗口,偷雞摸狗的人當然也知道,所以第一個問題就是標准帶來了更高的安全風險,於是乎很多人開始希望在自家門窗上加一把鎖,而且只有自己有鑰匙。最早加鎖的人還是微軟自己,MSN要保護用戶隱私,搞了個DirectUIHWND,被人發現后,DirectUI這個名稱就逐漸擴散開來,也有越來越多的軟件給自己的窗口加了鎖。從這個時候起,DirectUI = Windowless,就是為了跟不安全的有句柄窗口區別開來。DirectUI 的另一層含義就是隱秘、非標准,這個概念會在用戶心里生根,一旦有哪家的所謂 DirectUI 窗口因為流行而不幸成為另一個標准,它絕對會被人們踢出 DirectUI 陣營,結局跟有句柄窗口沒什么兩樣,就因為太標准而失去了隱秘的特性。也正是因為隱秘、非標准的特性,多少人削尖腦袋想找到 DirectUI 框架、類庫、標准,結果是找不到的,因為沒有標准。反過來說,只要不是標准的,都可以叫做 DirectUI,人人都可以自誇我的窗口是 DirectUI,其實不用誇,本來就是,誇多了會誤導更多人。
當然,Windowless 不僅僅是為了安全,在能力上自然也有自己的過人之處,這些能力就交給樓主來總結吧,我只舉個最小的例子:如果想讓一個窗口的某個子控件藏在背景貼圖的后面,普通窗口是辦不到的,對Windowless來說輕而易舉。 (22)你忽視了handless一個最大的好處,就是無閃爍繪圖,使用思想老舊的win32控件是很難做到毫無閃爍的。
p.s 現在騰訊全系列產品都是DirectUI。可以看到,它所有窗口的類名是TXGuiFoundation,它的目的很明顯就是想成為騰訊的MFC(Microsoft Foundation Classes)。 (23)duilib 庫不錯,是開源的。。現在正在發展。希望各位可以參與 www.duilib.org (24)這個和閃爍沒有任何關系。win32方式,可以做的一點閃爍也沒有。windowless,如果做不好,也是非常閃的。另外,所我了解,DirectUI是有copyright的,是個公司的產品名,不能隨便叫。
騰訊公司使用這種無窗口方式,一是為了防止第三方外掛。人家自己開發自己用,當然一點問題沒有。某個人離職了,還會有新來的人開發,不用擔心出了問題沒人管。 (25)樓主洋洋灑灑寫了這么多,從你列舉的諸多缺點里面我可以看出你的水平,你最多只是了解一些MFC,你可知除了MFC框架還有很多,而且更加優秀。 其他的不討論,我就把你所說的缺點一條一條的給你反駁吧
1:無窗口句柄只是內部的顯示控件沒有句柄,對這些控件的顯示與否完全可以通過 一個Show方法重新進行封裝,而且可控性更強 每個控件也同樣有自己的坐標屬性,比如Top,Left 來進行移動!
2:消息從來沒有作廢,每個控件也同樣有自己的消息處理函數,只是我們在窗體消息循環里面把需要的消息派發給這些自定義控件就可以了
關於以上兩點你可以了解一下VCL,可以說用Delphi隨便拖幾個控件(從TGraphicControl繼承)上去就是一個 Windowless界面了。有時你甚至感覺不出來 這些TGraphicControl控件和不同的標准控件有什么不同。
3:如果你的程序寫好了,更換界面需要花費的時間比開發時間還長,只能說這個軟件架構就是一坨屎!連最簡單的邏輯和界面分離都沒有把握好?
4:你用過別人開發的windowless控件嗎? 學習更多地東西會影響你的職業生涯嗎?
5:軟件的穩定和可靠性完全不是界面的事! 你還是先分清界面和邏輯功能的不同吧。
6:還是架構問題!功能層代碼應該完全和界面分離,如果你采用發送消息就已經是把功能和界面綁死了! 為什么不把界面設計成實現一個接口,比如有Update() 方法,不管界面采用何種方式,只要實現了接口中的Update方法就可以了。
7:這些都有成熟的機制,裁剪和坐標變化就兩個函數,繪制如果想要漂亮的界面不管你采用什么方法,都要繪制的。
8: 按你這條的意思在C#,JAVA剛出來的時候我也可以這樣說:全球幾乎所有的軟件都是使用C,C++開發的.......。 Windowless也是一種思想,wpf只不過是這種思想的一種實現罷了。
9:后期漢化..對這條:配置文件!你不是用過ini,xml嗎? 對多語言的支持不僅僅是翻譯一下,界面也要進行調節, 你就是采用標准的win32控件不也要配置? 后面的運行去其他程序發來的標准消息,這個需求我不懂什么時候要用到: 給木馬病毒留的后門?
10:這條才是你真是水平! 文檔/視圖不是MFC的專利,這是一種架構思想,如果脫離了MFC就不能使用文檔/視圖架構只能說 你就是一個填代碼的苦力。 那我又問你: 你們項目采用Wpf,里面也沒有文檔/視圖架構啊! 你不快終結項目,繼續MFC。。。
你眼中這些技術僅僅是表面的技術,完全沒有看到各種架構,各種設計的本質思想,所以你不會熟練運用它們,最后只會調用現成的方法! 我最后總結:你僅僅是弄了幾年界面,搶了美工的活! /////////////////////////////////////////////////// (1)DirectUI是一種技術簡稱,也叫windowless,不要被忽悠了。 國內做DirectUI的公司很多,有bodsoft,uieasy,uipower。 還有開源的duilib,那個uipower只是占了個directui的域名而已。
建議考慮迅雷7的界面引擎,目前已經開放了,都可以用。 文檔各方面會不斷完善,有興趣可加QQ群:62552336 http://xldoc.xl7.xunlei.com/0000000018/index.html (2)迅雷7用DirectUI做出的效果就很漂亮。 (3)如果大家有興趣,可以看看SKINSE界面庫。至於SKINSE到底怎么用?我相信下載看過的人會明白!!! http://www.skinse.com/ (4)DirectUI做出的界面效果還可以,不過自身也要有過硬的技術做基礎。 樓主可以借鑒一下qq的界面,貌似qq從2007開始就一直在用DirectUI做界面。不過真實性無從考證。 (5)雖然DirectUI開發界面的效果不錯,但是目前國內用DirectUI和懂DirectUI的人並不多。 (6)如果MFC足夠好用,可能會有那么多UI庫嗎?說句不好聽的,如果不是VC捆綁MFC,還會有多少人用不倫不類的垃圾MFC! /////////////////////////////////////////////////// (1)今年開始玩DirectUI,參考老外的程序,寫了個DirectUI的Demo, 支持各種Layout,實現了各種基本控件(SplitBar, PictureBox, Button, Radio, CheckBox, Label, HyperLink, ProgressBar, trackBar, ListBox, Edit, ComboBox, Tab Control, Toolbar, Menu, tree),支持鍵盤導航,支持Tooltip,支持多語言,支持換膚,支持異形窗口,支持插件2次開發,支持Alpha通道,支持各種圖像處理。
然后最近開始學WPF,學后自己的程序就不想再寫了,感覺再寫基於GDI的DirectUI已經沒多少意義,基本上QQ的UI已是基於GDI的DirectUI的極致了。
感覺理想的DirectUI設計上可以仿WPF,底層Render方式可以切換(Direct3D, OpenGL, GDI), 支持腳本,並且跨平台,應用程序和游戲都可以用,現在我還沒找到這么一套東西,不知大家對DirectUI怎么看?
Demo下載:http://download.csdn.net/detail/weiym/3698407 (2)要是支持那么多功能話,那得多大,這種界面庫以盡量輕量級比較好,否則和WPF又有什么區別呢。 你要想那樣的話,干脆直接界面用WPF或SilverLight吧,跨平台也支持硬件加速,支持XAML、CSS什么的…… (3)這樣的東西不一定大的,比如Render方式是可插拔的,根據不同的情況加載不同Render Engine就好了。 腳本支持一般是JavaScript,也是插件的方式,可以打開或關閉,可以考慮用Chrome的V8或是SpiderMonkey, Windows平台上也可以直接用MS IActiveScript. 跨平台很重要,可以在嵌入式里使用,所以Render一般可以用OpenGL,這樣MAC什么的都支持。
雖說工程比較龐大,編譯出的東西其實不一定大的。就像WPF,如果脫離.Net,其實也就幾個DLL。 (4)WPF和DirectUI確實如出一轍啊!:區別也有些: 就是DirectUI可以是GDI的,也可以是GDI+的。 而WPF本質是GDI+的【底層可能也用到硬件加速】,
另外不同的是WPF的抽象更好,而且WPF/Silverlight更為輕量【當然了,排除掉.Net的部署的考慮】
大多數C++的DirectUI停留在XML配置靜態UI,然后C++來實現后台邏輯。 而WPF更近一步,XAML除了配置UI,也可以指定一定的動畫。
大多數的C++的一個Xml就是一個完整的UI,不能嵌套,缺乏重用性。 而WPF的XAML可以有更好的模塊化,可以通過網絡Laz-Loading。 ----------------------------------------------------------------------------------------
當然了。。。真正寫軟件的時候,WPF就靠邊站了。。。 QQ是C++DirectUI的,360安全桌面,軟件管家是C++DirectUI的,金山很多產品也是C++DirectUI的【而且開源了,有人把它的UI抽出來了】
Qt的QML本質也算是C++DirectUI的。
但是問題是現在C++DirectUI的方式會越來越少了。。。 ------------------------------------------------------------------------------------------
Win8會更多支持HTML5,估計WPF也會被支持的很好。 iOS/MAC OS X人家無所謂,UI總是那么簡單弱智,沒有什么換膚的需求【我很少看到哪個Mac的程序還支持換膚,而且Mac的程序感覺UI都很簡單。】 ------------------------------------------------------------------------------- 我自己也在做DirectUI,是基於WTL的,而不是基於MFC的。感覺WTL的消息映射宏很帥! (5)目前開源的duilib就支持動態添加控件啊,插入一段Xml控件描述即可生成相應控件,絕不是靜態UI 基於gdi的directUI更適合移植 (6)討論DirectUI已經沒有意思了,這個玩意兒已經被炒爛了,自繪而已,加上一點消息處理,沒東西了。
XML描述UI更是噱頭,一種配置格式而已,跟INI、對話框模板沒有本質區別。再高級再動態的XML描述也擺脫不了需要指定控件位置大小的局限。唯一不需指定控件位置且全自動布局的只有HTML。
腳本就不要強求了,只是一個更具靈活性的擴展方式而已。如果在體系結構上不能整理出完整統一的對象模型,還不如不要腳本,要不然腳本編寫者會不停抱怨這個功能沒有、那個功能沒有,底層更新代碼都得累死。
硬件加速的渲染,如果沒有足夠的積累,還是不要輕易去碰,這是找罪受,不光是門檻太高的原因,個中滋味自己試試就知道了。這句是我最大的忠告。
動畫,有一點點就可以了,沒有太呆板,多了傷眼睛,我現在很煩瀏覽器中鋪天蓋地的FLASH動畫。這是UI和游戲的最大區別,游戲沒動畫就沒法玩了。好在動畫門檻不高,搞點小特效還算比較容易。做個通用動畫也不算太難,WPF中的通用動畫技術還是很值得借鑒的,因為人家總結得非常好。
跨平台,見仁見智吧,我覺得自己沒有多少發言權。定好目標客戶再決定要不要跨平台。跨平台的難度不在於多平台編碼經驗,而是設計水平。
一家之言,我也是搞UI庫的,上面的所有技術我都嘗試過。不過可惜,沒定好用戶群,有嚴重的方向性錯誤。 (7)網上有開原的DUILib,核心的消息分發代碼是類似的,你可以直接參考他的學習。 (8)現在看來WPF是最優秀的DirectUI, 他底層應該是基於D3D的。 配置的XML能處理一些簡單的邏輯和動畫配置,都是不是太難。 QT沒怎么用過,個人覺得它在Windows上的跨平台應該還是基於窗口的。 C++方式的DirectUI,個人覺得在嵌入式應該有廣泛應用,在Windows上的話界面和性能要求都比較高的時候還是有競爭力的,當然前提是這套DirectUI基於D3D。 (9)多謝忠告,個人覺得跨平台是DirectUI的優勢,在windows和Mac上它或許沒多少競爭優勢,但是在嵌入式和手機平台開發上,DirectUI還是很有價值的。另外WPF的設計思想對於設計一套優秀的DirectUI Library 還是很有借鑒意義的。 (10)你說得對,3D的玩意兒在嵌入式可能更有市場,這也是我努力的目標。為嵌入式設備定制大量的3D特效,也不需要為PC的那些懶用戶制作UI設計器了,在桌面市場做3D-UI感覺有點吃力不討好。 (11)我在WinCE中使用DirectUI, PC機下確實意義不大,嵌入式的卻比較好. (12)界面的核心永遠在於布局,審美,而不在於技術,DUI已經沒嚼頭了。 |