開源GUI框架庫:Nana C++ Library

jopen 12年前發布 | 42K 次閱讀 GUI C/C++開發

盡管C++是一門強大且語法靈活的語言,實際上,許多程序員并不喜歡用C++開發GUI,這是因為用C++來開發GUI太過復雜。現存的一些C++ GUI框架定義了一些規則,它需要你寫出一些死板的代碼才能運行,這總會導致一些問題,例如,讓你在深度的繼承層次中糾結,難以維護。現在,有另一個選擇了,Nana C++ Library,一個純粹的C++庫,讓你能完全發揮你的C++知識/技巧/手法來編寫GUI,這是用C++開發GUI的一個重大的進步。類似標準庫和boost代碼風格,很“現代”,包含GUI、線程以及文件系統等函數和類。目前支持windows和Linux X11平臺,分為C++03和C++11兩個分支。

特性:

* make GUI code easy to read/write/understand
* No need to #include<windows.h> such platform specified header
* flexible/easy to implement custom widget
* Bidirectional Languages supported
* Thread-safe
* cross-platform


易學,易用

用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, 0, 0, fm.size().width, fm.size().width); 
    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創建的對象會被“調用” 
    }); 
 
or 
 
fm.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)平臺上了。


最重要的特性:免費

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


項目主頁:http://www.baiduhome.net/lib/view/home/1355060023523

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!