Hello Nana
我们开始一个简单的程序,然后一行一行的讲解。
1 #include<nana/gui/wvl.hpp>
2 #include <nana/gui/widgets/label.hpp>
3 int main()
4 {
5 using namespace nana::gui;
6 form fm;
7 label lab(fm, nana::size(100,
20));
8 lab.caption(STR("Hello Nana"));
9 fm.show();
10 exec();
}
第一行和第二行,包含定义在 namespace nana::gui 中的 form 类和 label 类。所有用Nana C++ Library开发的界面程序都需要包含<nana/gui/wvl.hpp>。
第五行,将nana::gui这个命名空间引入到main函数域中,使编译器可以直接查找到定义在nana::gui中的名字,例如:form, label, exec。
第六行,定义一个名为fm的form对象。在该例子中,这是一个用于摆放label微件的窗口。
第七行,定义一个名为lab的label对象,是一个用于显示文本字符串的标签微件,被创建在窗口中。微件是用户界面中的一个可视元素。
第八行,设置label对象的标题,每个微件都有一个caption()方法用于设置标题。在这行代码中,有一个被名为STR()的宏引用的字符串,这个宏用来外覆一个字符串,作用是使程序在UNICODE和多字节版本之间方便地切换。
第九行,使窗口可见。
第十行,将程序的控制权交给Nana库,此时,程序进入事件循环,等待并接收用户输入,例如,鼠标的移动,单击和键盘的敲击等等,exec()函数会阻塞该线程,直到窗口fm被关闭,在该例中,当关闭掉窗口,程序也随即结束。
Figure 1.1 Hello Nana
现在,使该程序在你的系统中运行之前,你应该安装Nana C++ Library。在帮助目录中,Installation Library Documentation讲解了安装的方法。
事件处理
为了接收用户的操作,需要对指定的微件注册事件处理函数,Nana库会等待用户输入,然后触发与事件对应的事件处理函数。第二个例子展示如何响应用户操作,该程序由一个按钮组成,当点击该按钮,程序就退出。
#include <nana/gui/wvl.hpp> #include <nana/gui/widgets/button.hpp> int main() { using namespace nana::gui; form fm; button btn(fm, nana::size(100, 20)); btn.caption(STR("Quit")); btn.make_event<events::click>(API::exit); fm.show(); exec(); }
这段代码和第一个例子很相似,只是把label换成了button,并且给按钮注册了一个click(单击)事件。所有的widget(微件)类都提供一组方法用于注册事件,这组方法全都名为make_event,这是一个函数模板,第一个模板参数指定了一个事件的类型,并且必须显式指定。该函数模板的参数为事件的处理函数,API::exit()是Nana库提供的一个函数,用于关闭当前UI线程中的所有窗口,并退出事件循环函数。在该例中,当单击按钮时,API::exit()会被调用,然后窗口被关闭,程序随即结束。
在下篇中,我们将讲解函数对象和lambdas,以及这两个语言特性是如何运用在事件处理中,使程序的结构更加的清晰。