Nana C++ Library:初探

來源:互聯網
上載者:User

儘管C++是一門強大且文法靈活的語言,實際上,許多程式員並不喜歡用C++開發GUI,這是因為用C++來開發GUI太過複雜。現存的一些C++ GUI架構定義了一些規則,它需要你寫出一些死板的代碼才能運行,這總會導致一些問題,例如,讓你在深度的繼承層次中糾結,難以維護。現在,有另一個選擇了,Nana C++ Library,一個純粹的C++庫,讓你能完全發揮你的C++知識/技巧/手法來編寫GUI,這是用C++開發GUI的一個重大的進步。

易學,易用

用Nana建立一個Hello World程式有多易?

#include <nana/gui/wvl.hpp>#include <nana/gui/widgets/label.hpp>int main(){using namespace nana::gui;form fm;label lb(fm, fm.size());lb.caption(STR("Hello, World"));fm.show();exec();}

非常簡單,易懂的代碼。Nana引入簡單和合理的概念使其保持簡潔。其次,不像那些由於命名約束和文法約束導致編寫死板代碼的架構,Nana能使你的代碼更加直觀和可讀。例如,響應一個事件。

#include <nana/gui/wvl.hpp>#include <nana/gui/widgets/button.hpp>void clicked(const nana::gui::eventinfo&){//When the window corresponds to fm is clicked, this function will be "called".}int main(){using namespace nana::gui;form fm;fm.make_event<events::click>(clicked);fm.show();exec();}

函數clicked()的名字並不是強約束的,你可以給它任意取一個名字。這比通過繼承某個事件介面來實現響應的方法更加直觀。在某些情況下,我們並不需要關心clicked()函數的的參數,例如上面那個樣本。

void clicked() //無參數.{//When the form is clicked, this function will be "called".}fm.make_event<events::click>(clicked); //Nana同樣允許!

非常靈活,使你的代碼保持簡單明了。這個特性同樣適用於函數對象。

什麼使Nana如此靈活?

Nana C++ Library 不包含任何“額外的編譯器”來解析“特殊的文法”, Nana使用100%的C++和模板技術使其強大和靈活。Nana並非像其他那些基於模板的程式庫, 導致大量的代碼膨脹,並且要求程式員具有模板技巧。Nana對 C++的新手來說也是非常友好的。

Nana是一個完完全全的C++風格的程式庫,能運行在Visual C++ 7.1/GCC 3.4及以上的編譯器。如果你是C++專家,Nana也允許你使用C++11中最新的特性Lambda來處理事件。例如

fm.make_event<events::click>([]{//當視窗被點擊, 這個由lambda建立的對象會被“調用”});orfm.make_event<events::click>([](const eventinfo& ei){//當視窗被點擊, 這個由lambda建立的對象會被調用,//並且通過ei可以擷取這個事件的參數資訊});

另外,如果Nana與C++11中的std::bind一起使用,就能獲得更大的靈活性。

多線程

簡單地說,Nana是安全執行緒的,在不同的線程中訪問widget對象也變成平常的事情。這是一個重要的特性,可以讓程式員很方便的把事件處理提交由其他的線程處理。例如

#include <nana/gui/wvl.hpp>#include <nana/threads/pool.hpp>void foo(){//該函數會在由線程池建立的線程中“調用”}int main(){using namespace nana::gui;using namespace nana::threads;pool thrpool;form fm;fm.make_event<events::click>(pool_push(thrpool, foo));fm.make_event<events::click>(pool_push(thrpool, []{//同樣可以使用Lambda運算式}));fm.show();exec();}

RAII

有一個重要的特性,展現在上面那些樣本中。當form對象被建立,與它對應的視窗也會被建立,而這個視窗會一直隱藏著,直到調用了show()方法。當form對象被銷毀,與它對應的視窗也隨之關閉,這也符合C++的對象生命週期的概念。

跨平台編程

Nana C++ Library 是被設計成用來進行跨平台編程的,雖然第一個版本的發布只能運行在Windows上,但是現在這個庫基本上移植到Linux(X11)平台上了。

最重要的特性:免費

這是一個開源的項目,對於非商業應用和商業應用來說都是免費的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.