Nana C++ Library:初探

该文档内容更新为 Nana 0.8的版本,基于C++11

尽管C++是一门强大且语法灵活的语言,实际上,许多程序员并不喜欢用C++开发GUI,这是因为用C++来开发GUI太过复杂。现存的一些C++ GUI框架定义了一些规则,它需要你写出一些死板的代码才能运行,这总会导致一些问题,例如,让你在深度的继承层次中纠结,难以维护。现在,有另一个选择了,Nana C++ Library,一个纯粹的C++库,让你能完全发挥你的C++知识/技巧/手法来编写GUI,这是用C++开发GUI的一个重大的进步。

 

易学,易用

用Nana创建一个Hello World程序有多易?

 

[cpp] view plaincopy
 
  1. #include <nana/gui.hpp>  
  2. #include <nana/gui/widgets/label.hpp>  
  3. int main()  
  4. {  
  5.     using namespace nana;  
  6.     form fm;  
  7.     label lb(fm, fm.size());  
  8.     lb.caption(L"Hello, World");  
  9.     fm.show();  
  10.     exec();  
  11. }  



 

非常简单,易懂的代码。Nana引入简单和合理的概念使其保持简洁。其次,不像那些由于命名约束和语法约束导致编写死板代码的框架,Nana能使你的代码更加直观和可读。例如,响应一个事件。

 

[cpp] view plaincopy
 
  1. #include <nana/gui.hpp>  
  2. #include <nana/gui/widgets/button.hpp>  
  3.   
  4. void clicked(const nana::arg_mouse&)  
  5. {  
  6.     //当窗口被点击,该函数将会被调用.  
  7. }  
  8.   
  9. int main()  
  10. {  
  11.     using namespace nana;  
  12.     form fm;  
  13.     fm.events().click(clicked);  
  14.     fm.show();  
  15.     exec();  
  16. }  

 

 

函数clicked()的名字并不是强约束的,你可以给它任意取一个名字。这比通过继承某个事件接口来实现响应的方法更加直观。在某些情况下,我们并不需要关心clicked()函数的的参数,例如上面那个示例。

 

[cpp] view plaincopy
 
  1. void clicked() //无参数.  
  2. {  
  3.     //当窗口被点击,该函数将会被调用.  
  4. }  
  5.   
  6. fm.events().click(clicked); //Nana同样允许!  


非常灵活,使你的代码保持简单明了。这个特性同样适用于函数对象。

 

 

什么使Nana如此灵活?

Nana C++ Library 不包含任何“额外的编译器”来解析“特殊的语法”, Nana使用100%的C++和模板技术使其强大和灵活。Nana并非像其他那些基于模板的程序库, 导致大量的代码膨胀,并且要求程序员具有模板技巧。Nana对 C++的新手来说也是非常友好的。

 

Nana是一个完完全全的C++风格的程序库,能运行在Visual C++ 2013/GCC 4.7及以上的编译器。

 

[cpp] view plaincopy
 
  1. fm.events().click([]{  
  2.         //当窗口被点击, 这个由lambda创建的对象会被“调用”  
  3.     });  
  4.   
  5. or  
  6.   
  7. fm.events().click([](const nana::arg_mouse& arg){  
  8.         //当窗口被点击, 这个由lambda创建的对象会被调用,  
  9.         //并且通过arg可以获取这个事件的参数信息  
  10.     });  

 

 

布局管理

Nana提供了一个可扩展的、灵活的类来处理大多数情况的布局要求,详情可参见帮助文档

 

多线程

简单地说,Nana是线程安全的,在不同的线程中访问widget对象也变成平常的事情。这是一个重要的特性,可以让程序员很方便的把事件处理提交由其他的线程处理。例如

 

[cpp] view plaincopy
 
  1. #include <nana/gui.hpp>  
  2. #include <nana/threads/pool.hpp>  
  3.   
  4. void foo()  
  5. {  
  6.     //该函数会在由线程池创建的线程中“调用”  
  7. }  
  8.   
  9. int main()  
  10. {  
  11.     using namespace nana;  
  12.     using namespace nana::threads;  
  13.       
  14.     pool thrpool;  
  15.     form fm;  
  16.     fm.events().click(pool_push(thrpool, foo));  
  17.     fm.events().click(pool_push(thrpool, []{  
  18.                     //同样可以使用Lambda表达式  
  19.                 }));  
  20.     fm.show();  
  21.     exec();  
  22. }  


RAII

 

有一个重要的特性,展现在上面那些示例中。当form对象被创建,与它对应的窗口也会被创建,而这个窗口会一直隐藏着,直到调用了show()方法。当form对象被销毁,与它对应的窗口也随之关闭,这也符合C++的对象生命周期的概念。

 

跨平台编程

Nana C++ Library 是被设计成用来进行跨平台编程的,虽然第一个版本的发布只能运行在Windows上,但是现在这个库基本上移植到Linux(X11)平台上了。

 

最重要的特性:免费

这是一个开源的项目,对于非商业应用和商业应用来说都是免费的。

posted @ 2015-07-21 15:49  greenplace  阅读(1021)  评论(0)    收藏  举报