Windows 界面開發的歷程

這是個漫長的過程,我工作的前十幾年都是寫 Windows 程序過來的,經歷了 Windows 程序開發的所有歷程,從早期Delphi, VB的快速開發模式到後來的MFC,到後來自繪,然後是開源脫離了 Windows。

控制項

在操作系統提供的控制項模式下寫代碼沒有什麼成就感,但是這類應用需求變得越來越少,產品界面都趨向於花哨、自定義皮膚方向,主流的聊天程序,音樂播放器,連下載程序、殺毒軟體都是如此。所以當時很多人都在研究Windows系統控制項的自繪,就是改變控制項繪製、響應。當時微軟有幸泄漏了Windows 180MB的源代碼,裡面有幾戶所有用戶態控制項,甚至IE瀏覽器代碼,我幾乎拜讀了一遍。利用過一些沒有在MSDN文檔里出現的值、結構來繪製 ListView, ComboBox, RichEdit等。效果是出來了,但是一旦系統大升級可能就失效了,好在產品生命周期都不比Windows XP更長。

這種方式有個致命的天花板,就是控制項庫的文檔,由於Windows是閉源的,只有文檔可以依賴。開發人員能做的很有限,界面效率、自定義程度都是難題。於是開始出現全自繪的代碼,有DirectUI等幾個吧。但是我轉向了開源。

開源的 2D 矢量自繪製的界面

當時我看遍了當時所有的可選項,wxWidgets, QT等, boost.org 里有討論ui庫,裡面幾乎有所有的實現。我選擇了一個矢量繪製實現(ultimatepp.org,簡稱UPP),這是一個歐洲人做的比較小眾,整個代碼庫大概有40萬行代碼(核心也有10萬+行),所有控制項都實現了,支持Windows, X-Windows。但是效果驚人,各種半透明、漸變、圓角、動畫,還有文字效果和編輯、甚至圖文混排都脫離了操作系統的控制,不需要和系統資源(GDI Handle)和控制項交互,從此沒有操作系統的天花板了,就是無所不能了。

C++語言衍化了這麼多年,但是寫界面的方法一直沒有太大變化,不能不說整個界面編程是個被人遺忘的技術領域,有想法的人都去做更有挑戰性的事情了吧。但是UPP往前進了,把MFC,Java UI的方法至少甩出20年。界面布局、消息響應、圖片資源文件的訪問等都做到了極致。甚至連編譯速度比Visual Studio IDE快十倍(雖然都是用那個cl, link)。

說一下布局的支持吧。這是一段可執行的代碼:

LAYOUT(DlgLayout, 208, 64)n ITEM(Label, dv___0, SetLabel(t_("Label")).LeftPosZ(8, 36).TopPosZ(8, 19))n ITEM(EditString, text, LeftPosZ(48, 92).TopPosZ(8, 19))n ITEM(Option, option, SetLabel(t_("Option")).LeftPosZ(8, 108).TopPosZ(32, 15))nEND_LAYOUTn

完成了三個控制項的布局和容器縮放的規則,比起如今iOS/Android開發的方式好了不少吧。

消息響應

struct MyAppWindow : TopWindow {n Button button;nn void Click() { PromptOK("You have clicked the button!"); }nn typedef MyAppWindow CLASSNAME;nn MyAppWindow() {n Title("My application with button");n Add(button.LeftPos(10, 100).TopPos(10, 30));n button.SetLabel("Click me!");n button <<= THISBACK(Click);n }n};n

能在沒有boost::function的年代就把函數指針利用得優雅無比。相比Objective-C里的block, selector其實好很多。

觀點

手機應用界面開發和 Windows 程序界面開發的歷程完全一樣。開發者都會經歷IDE快速開發,手工布局,自定義繪製,完全重頭實現這些階段。所以以上經歷還是能稍有借鑒意義的。

比較詭異的是Android採用的Java在寫界面程序方面幾十年沒有變化,雖然是號稱比C++高級的語言,這貨能把代碼寫得如上面般簡潔么?在Android上也不可能使用C++編寫普通界面應用。iOS的 Objective-C 也是如此,見過大部分程序員只用代碼布局,nib基本不用的,出了StoryBoard可能稍微好了一點。這兩家獨大,讓C++在移動應用界面開發領域幾乎無用武之地。

但是Google的Flutter徹底顛覆了這個流程,直接跳到了矢量繪製的階段,我還需要期待什麼呢?

這個結論有點突兀,有點詭異。過了好多年了,對個中細節實在沒有太多心氣勁深入,很多值得深入的地方沒有一一描述清楚。大家湊合看吧,什麼地方有爭議可以提出來。

參考鏈接

- GUI Tutorial :: Ultimate++

- Ultimate++ vs Java/Swing :: Ultimate++

推薦閱讀:

有關互聯網界的「借鑒」表達一點小小看法
從零開始的Android新項目1 - 架構搭建篇
#每天一個小目標#Unity技術分享(十)
我想開發一個APP,現在有React Native 和 API Cloud 兩個框架,我該如何選擇?
不越獄,直接跳過 App Store 安裝軟體是什麼原理?

TAG:移动开发 | C | VisualC |