只使用 C++ 標準語法和標準庫如何做出優美的人機界面?

如題,我曾使用過 MFC、Qt 等框架,但不了解它們的原理,想自己從零開始做界面。


你可以從DirectUI開始做起啊


標準庫裡面沒有圖形庫,如果有就可以做到樓主說的,只使用標準語法+標準庫。你至少需要某種圖形庫,比如OpenGL、DirectX、或者GDI什麼的。做界面理論上不難,但是實際工作很繁瑣,細節很多。需要付出很大的精力和時間,但是產出並不大。因為這個世界上能用的GUI系統已經不少了,沒必要重新發明一個輪子,如果想要個性或者獨立的想法,可以在皮膚開發這類問題上下功夫,或者改造已有的某種庫。


你至少也要從API開始,譬如CreateWindowEx,還有至少選擇一個渲染器,譬如Direct2D,不然怎麼跟系統交互?

當然寫GUI是一件很容易的事情,只要有紮實的設計模式的基礎就好了。面向對象的技術當初發明出來,原始動機就是為了描述GUI的,所以非常合適拿來訓練。就算是那些旁門左道的幾個著名的C語言寫的GUI,都還要不辭辛苦地模擬一下面向對象,真是閑的蛋疼。

你可以來參考gayui:http://github.com/vczh-libraries/GacUI

想運行代碼的話去 http://github.com/vczh-libraries/Release


是不是只用C++標準不重要,重要的是可以怎麼玩。之前用MFC, WTL, WIN32 API, 然後Qt。給Unity3D寫插件時,發現界面還可以這樣寫,然後發現 ocornut/imgui ,已入坑。現在demo寫得神清氣爽。


MFC、Qt又不是只用了標準庫,還有很多OS相關的庫。題主的要求是不可能做到的。


別聽 @vczh @叛逆者 胡扯

你可以用標準 C++ 讀取列表,生成一個二進位形式的 OS API binding object,然後用它就可以調用 OS 的功能了。你自己寫的代碼沒用標準庫之外的內容,符合題目要求。


我覺得正常的問題難道不應該是「我已經深刻理解了MFC和Qt,現在我想自己從頭開始實現一個GUI庫了,應該怎麼做?」嗎。。。樓主這種問題等同於「醫學那些書我都不太理解,我現在想只用一把手術刀就做一個癌症手術,請問應該怎麼做?」


C++標準目前不包含圖形部分,雖然有一個圖形的 實驗特性Experimental C++ Features。題主先要等這個雞肋的 Graphics TS 變成C++標準的一部分,才有那麼一點希望。至於優美,那是UI設計的問題,與C++的關係不大。


DOS時代有個火星人套裝,用C++實現了類Windows界面。用的還是Borland C++。

全部用的基本庫。MFC那時候都太先進了。裡面封裝的是DOS API,和Open Gl啥的一點關係都沒有。

這個只是我記住的。類似的軟體很多。可以實現各種界面。


我同意 @Belleve 說 @vczh 胡扯,但是他也沒說到點子上。應該是用一根針在 CD 上刻刻刻就成了。

要用 C++,你就刻一個 wrapper,

void* data = 你刻刻刻刻刻(不過前面也是你刻);
int main(int argc, char** argv)
{
((void (*)())data)();
// never reach here because your UI is running on bare
// metal and never quit
return 0;
}


你把標準委員會買下來,然後把某個 GUI 框架欽定為標準庫,在上面寫。

或者你將 OS 與硬體接觸的某些部分欽定到標準語法里,然後拿這套標準語法寫 OS 和 GUI ,連標準庫都不用依賴。


光用標準庫是搞不出GUI的,標準庫里缺乏顯示輸出和滑鼠輸入等的介面


從0開始。

或許我知道你想要的是什麼。

我們先假設 我們的平台暫時限定在windows 平台。

那麼 你需要的就是一個窗口 和 句柄d。這個你不可避免。

至於這個窗口裡面 的 控制項(姑且稱之為控制項)什麼畫 怎麼交互。你都可以自己決定。這些就是自己要做的,也是 mfc 或 其他UI框架也好 引擎也罷 要做的事情。

捕獲硬體的事件 讓你自己畫的UI進行反饋。聽上去很簡單。

其實自己動手也沒什麼難的,關鍵是看你做到什麼地步。

圖形庫什麼的 你可以自己寫,但是絕大部分人都是 用開源的。比如 Skia 或者 Cairo。


取決於你怎麼定義GUI。

第一種解釋:開發windows GUI

要像一般的程序一樣遵守系統的窗口管理、焦點管理甚至盲人功能等等體系,這種情況下,你怎麼都繞不開Win32 API,MFC是Win32 API的封裝,你可以用C++載入Win32 API的dll文件並且直接調用裡面的函數,比如CreateWindowEx……

針對特定Linux發行版的GUI系統同理。

Qt、XWindow等框架可以視為它們的跨平台封裝,當然跨平台會丟失一些特性。

第二種解釋:有圖形的都算GUI

於是你的選擇就多了起來,當然最好還是整個圖形庫,牛逼閃閃的OpenGL系列和DirectX系列都行,TC++當年還有graphics.h,反正只要是個圖形庫就行。

第三種解釋:我就是要從頭硬擼

你就只能操作顯卡驅動了,當然驅動不是你想操作就能操作,也得通過不同的操作系統,而且驅動兼容性一般都很差。


首先,不過是 Windows 還是 macOS,都需要一個系統提供的 API 來顯示標準窗口,然後才能在之上繪製內容。Linux 系就有點特殊了,大多數發行版都採用 Xorg,你可以把它想像成 Server,你的 app 就是 Client,通過 IPC 調用與其交互,Xorg 擁有寫屏能力,可以說是直接控制了顯卡,所以如果你想從頭搞 GUI,在 Xorg 的基礎上重新開發一遍窗口管理器,再臨摹個 Gtk 應該差不多。當然,不喜歡 Xorg 還可以去研究一下 Wayland。


這是不可能的。圖形界面、鍵鼠時間要麼是操作系統API的一部分(Windows),要麼是一個系統級組件(Unix X Window),顯然不在「C++標準語法、標準庫」的範疇內。


找個單片機板子,接個12864,玩玩……先把屏幕上為什麼會顯示東西弄明白……


你在MFC找個函數,調用棧一路點進去看原型,你就會發現最後停在了那些非標準的東西上了。說到底語言的標準是平台無關的,不會提供給你畫屏幕這種功能


台灣有本書叫做

事件驅動程式設計

介紹用 MVC 的作法實作出一個文字 GUI 系統。是 dos 的版本。

我在 linux 上用 ncurses 實作過這個 GUI。

心得在這 (應該要翻牆)

http://descent-incoming.blogspot.tw/2012/07/gui.html

完成後讓我知道所謂的訊息流動是一個什麼樣的概念。model, view, controller 是什麼, 而不是只有名詞上的理解。

需要使用的 c++ 東西不多, 要知道 ncurses 怎麼使用。

不過沒學到怎麼重畫被遮到的視窗, 我是一律從桌面畫起, 比較費時, 但這不會影響學習 GUI 系統的細節。


雖然MFC、QT使用了C++,但並不僅僅是一個UI框架,它們利用C++封裝了系統提供的UI繪製、消息響應、事件系統、底層基礎以及相應的周邊建設,這其中的工作量可想而知,後期還需要經過大量的優化、測試和驗證。

假設題主的問題是想利用C++從零寫一個UI庫。那麼你需要做的事情大概有幾項:

1.至少要熟練使用C++以及標準庫。

2.至少要熟悉當前平台上的UI繪製系統、消息(事件)系統以及一些底層知識,一個梨子:windows消息循環。

3.至少要深入了解過MFC和QT,熟悉它們是如何封裝、實現相關功能。兩個梨子:windows消息循環在MFC裡面是如何運作的?QT界面上的事件響應(比如點擊了一個Button)是如何實現的?

4.至少要熟悉和熟練使用多種繪製系統,了解其繪製工作是如何進行的,兩個梨子:GDI和Direct2D。

以上都需要知其然也要知其所以然。


推薦閱讀:

如何用 C++ 在 10 行內寫出八皇后?
C/C++該採用怎樣的命名規則才能讓自己的代碼足夠清晰呢?
如何才能學到Qt的精髓?
C++20有望實現自動PIMPL嗎?
如何評價 Herb Sutter 的 C++ 提案:metaclasses?

TAG:用戶界面設計 | C |