让LU留住您的每

一天 让LU博客留住您的每一天
2004-9-22 22:43 无双
&lt;a href=&quot;http://www.fltk.org/&quot;&gt;FLTK&lt;/a&gt;(Fast Light Tool Kit<br />发音为fulltick)<br />是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相<br />对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。本文就FLTK编程的一些基本方法进<br />行介绍。&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;1&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;FLTK功能简介&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br /><br />&lt;p&gt;1.        提供丰富的跨平台的GUI构件(Widget)。有按钮,菜单,窗口等,近六十个。&lt;/p&gt;<br />&lt;p&gt;2.        支持OpenGL,提供Fl_GL_Window,支持OpenGL相关的操作。&lt;/p&gt;<br />&lt;p&gt;3.        提供界面设计工具FLUID,非常方便进行界面的设计。&lt;/p&gt;<br />&lt;p&gt;4.        良好的跨平台移植性。&lt;/p&gt;<br />&lt;p&gt;5.        支持多种C++编译器,Gcc,BC,VC等等。&lt;/p&gt;<br />&lt;p&gt;6.        灵活性。FLTK本身可以定制,以满足不同的需要。这使得FLTK在嵌入式开发上有着极大的竞争力,这正是我要推荐使用FLTK的原因。&lt;/p&gt;<br />&lt;p&gt;本文就FLTK编程的一些基本方法进行介绍。&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;2&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;安装&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        &lt;p&gt;安装FLTK很简单,我们只<br />需要下载它的源文件,解压缩到目录下,在Linux下我们只需要输入make,编译完成然后make<br />install就头文件安装到/usr/include/FL目录下。库文件就在/usr/lib下,也可以自己编译之后把这些文件复制到这些目录,或者<br />不需要复制,只在编译连接的时候指定路径。&lt;/p&gt;<br /><br />        &lt;p&gt;在window下可以使用VC,BC打开相应目录下的工程文件编译即可。&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;3&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;FLTK构件简介&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br /><br />&lt;p&gt;FLTK作为GUI开发包,包含了常用的图形用户接口需要的一些构件,视觉表现非常丰富,如下两图所示:&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image002.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;333&quot; width=&quot;553&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image004.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;415&quot; width=&quot;553&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br /><br /> &lt;p&gt;&lt;b&gt;常用按钮构件&lt;/b&gt;&lt;/p&gt;<br /> &lt;table border=&quot;1&quot; width=&quot;80%&quot;&gt;<br /><br /> &lt;tbody&gt;&lt;tr&gt;<br />         &lt;td&gt;按钮名称&lt;/td&gt;<br />         &lt;td&gt;头文件&lt;/td&gt;<br />         &lt;td&gt;按钮名称&lt;/td&gt;<br />         &lt;td&gt;头文件&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;tr&gt;<br /><br />         &lt;td&gt;Fl_Button&lt;/td&gt;<br />         &lt;td&gt;Fl_Button.H&lt;/td&gt;<br />         &lt;td&gt;Fl_Check_Button&lt;/td&gt;<br />         &lt;td&gt;Fl_Check_Button.H&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;tr&gt;<br />         &lt;td&gt;Fl_Light_Button&lt;/td&gt;<br /><br />         &lt;td&gt;Fl_Light_Button.H&lt;/td&gt;<br />         &lt;td&gt;Fl_Repeat_Button&lt;/td&gt;<br />         &lt;td&gt;Fl_Repeat_Button.H&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;tr&gt;<br />         &lt;td&gt;Fl_Return_Button&lt;/td&gt;<br />         &lt;td&gt;Fl_Return_Button.H&lt;/td&gt;<br /><br />         &lt;td&gt;Fl_Round_Button&lt;/td&gt;<br />         &lt;td&gt;Fl_Round_Button.H&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;/tbody&gt;&lt;/table&gt;<br />                        <br />        &lt;p&gt;对于具有Fl_Check_Button、Fl_Loght_Button和Fl_Round_Button当状态为off时value() =0 ,On时value()返回1。&lt;/p&gt;<br />        &lt;p&gt;处理按钮时间可以使用回调(callback)函数,参见后面的事件处理。&lt;/p&gt;<br />         &lt;p&gt;&lt;b&gt;文本处理构件&lt;/b&gt;&lt;/p&gt;<br /><br /> &lt;table border=&quot;1&quot; width=&quot;80%&quot;&gt;<br />        &lt;tbody&gt;&lt;tr&gt;<br />                &lt;td&gt;构件名称&lt;/td&gt;<br />                &lt;td&gt;头文件&lt;/td&gt;<br />                &lt;td&gt;构件名称&lt;/td&gt;<br />                &lt;td&gt;头文件&lt;/td&gt;<br />        &lt;/tr&gt;<br /><br />        &lt;tr&gt;<br />                &lt;td&gt;Fl_Input&lt;/td&gt;<br />                &lt;td&gt;Fl_Input.H&lt;/td&gt;<br />                &lt;td&gt;Fl_Output&lt;/td&gt;<br />                &lt;td&gt;Fl_Output.H&lt;/td&gt;<br />        &lt;/tr&gt;<br />        &lt;tr&gt;<br /><br />                &lt;td&gt;Fl_Multiline_Input&lt;/td&gt;<br />                &lt;td&gt;Fl_Multiline_Input.H&lt;/td&gt;<br />                &lt;td&gt;Fl_Multiline_output&lt;/td&gt;<br />                &lt;td&gt;Fl_Multiline_output.H&lt;/td&gt;<br />        &lt;/tr&gt;<br />        &lt;/tbody&gt;&lt;/table&gt;                <br />                        <br />&lt;p&gt;设置和取得文本内容使用value();&lt;/p&gt;<br /><br />&lt;p&gt;如:&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />(new  Fl_Input(x,y,width,height,&quot;Label&quot;))-&amp;gt;value(&quot;Hello World&#33;&quot;);<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br /><br />         &lt;p&gt;&lt;b&gt;其他构件&lt;/b&gt;&lt;/p&gt;<br />&lt;p&gt;参见FLTK.org的&lt;a href=&quot;http://www.fltk.org/documentation.php&quot;&gt;文档&lt;/a&gt; 说明。&lt;/p&gt;<br />         &lt;p&gt;这些构件是使用C++开发的,具有完善的继承关系,下面是构件继承关系图&lt;/p&gt;<br /><br /> &lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image005.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;478&quot; width=&quot;319&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt;<br /> &lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image006.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;413&quot; width=&quot;307&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt;<br /> <br />         &lt;p&gt;构件使用例子-HelloWorld&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />#include &amp;lt;FL/Fl.H&amp;gt;<br />#include &amp;lt;FL/Fl_Window.H&amp;gt;<br /><br />#include &amp;lt;FL/Fl_Box.H&amp;gt;<br /><br />int  main (int argc, char *argv[])<br />{<br />    Fl_Window  *window;<br />    Fl_Box  *box;<br /><br />window  =  new  Fl_Window (300, 180);<br />window-&amp;gt; label(&quot;HelloWorld&#33;&quot;);   //添加window的标题<br />    box  =  new Fl_Box (20, 40, 260, 100, &quot;Hello World&#33;&quot;);<br /><br />    box-&amp;gt;box (FL_UP_BOX);<br />    box-&amp;gt;labelsize (36);<br />    box-&amp;gt;labelfont (FL_BOLD+FL_ITALIC);  //设置字体<br />box-&amp;gt;labeltype (FL_SHADOW_LABEL);  //设置label的类型<br />/***************************************************************<br />进入FLTK的事件循环处理过程<br />***************************************************************/<br />    window-&amp;gt;end ();<br />    window-&amp;gt;show (argc, argv);<br />    return  Fl::run();<br />}<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br /><br />&lt;p&gt;在window下程序编译运行后如图所示:[使用VC6编译优化后大小为116K]&lt;/p&gt;<br /><br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image007.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;205&quot; width=&quot;306&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br />&lt;p&gt;Linux下图片[编译未优化大小358K]&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image008.png&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;206&quot; width=&quot;312&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br /><br />&lt;p&gt;&lt;a name=&quot;4&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;FLTK事件处理&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        &lt;p&gt;对于一般构件的如按钮,菜单等常用事件的处理一般可以使用回调函数实现,回调函数的原型是:&lt;/p&gt;<br />&lt;pre&gt;void  XXX_callback( Fl_Widget *w,void *data )<br />{<br />//添加自己处理的内容<br />}<br />&lt;/pre&gt;<br />&lt;p&gt;使用F1_Widget-&amp;gt;callback( XXX_callback,data) 注册回调函数&lt;/p&gt;<br /><br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />/***************************************************************<br />按钮事件例子<br />***************************************************************/<br />#include &amp;lt;FL/Fl.H&amp;gt;<br />#include &amp;lt;FL/Fl_Window.H&amp;gt;<br />#include &amp;lt;FL/Fl_Button.H&amp;gt;<br />#include &amp;lt;FL/Fl_ask.H&amp;gt;<br />void Btn01_cb(Fl_Widget *w,void *data)<br />{<br /> ((Fl_Button *)w)-&amp;gt;label((char *)data);<br />fl_alert(&quot;Hello&quot;);<br /> }<br /><br />int main(int argc, char **argv)<br /> {<br /> char *buff =&quot;Hello&quot;;<br /> Fl_Window* w = new Fl_Window(272, 144);<br /> Fl_Button* Btn01 = new Fl_Button(85, 50, 105, 25, &quot;&amp;amp;Test callback&quot;);<br /> Btn01-&amp;gt;shortcut(FL_ALT+&#39;t&#39;);               //定义按钮的快捷键<br /> Btn01-&amp;gt;callback((Fl_Callback*)Btn01_cb,buff); //调用处理函数 buff作为参数<br /> <br /> w-&amp;gt;end();<br /> w-&amp;gt;show(argc, argv);<br />  return Fl::run();<br />}<br /><br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br />&lt;p&gt;编译运行程序,鼠标点击按钮,按钮标签会发生改变,并且会弹出提示框。&lt;/p&gt;<br />&lt;p&gt;通常的callback是当构件的value改变时调用,可以使用when()改变为其他事件发生调用回调函数,主要事件有以下事件&lt;/p&gt;<br /> &lt;table border=&quot;1&quot; width=&quot;80%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;<br />        &lt;td&gt;事件&lt;/td&gt;<br />        &lt;td&gt;说明&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_WHEN_NERVER&lt;/td&gt;<br /><br />        &lt;td&gt;从不调用回调函数&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_WHEN_CHANGED&lt;/td&gt;<br />        &lt;td&gt;当构件值改变时调用&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_WHEN_RELEASE&lt;/td&gt;<br />        &lt;td&gt;当释放按键或者鼠标并且构件值改变&lt;/td&gt;<br /><br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_WHEN_RELEASE_ALWAYS&lt;/td&gt;<br />        &lt;td&gt;当释放按键或者鼠标,即使构件值没有改变&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_WHEN_ENTER_KEY&lt;/td&gt;<br />        &lt;td&gt;按下Enter键并且构件值改变&lt;/td&gt;<br />&lt;/tr&gt;<br /><br />&lt;tr&gt;<br />        &lt;td&gt;FL_WHEN_ENTER_KEY_ALWAYS&lt;/td&gt;<br />        &lt;td&gt;按下Enter键,即使构件值没有改变&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/tbody&gt;&lt;/table&gt;<br />        <br />&lt;p&gt;通过使用F1_Widget-&amp;gt;when(FL_WHEN_XXXX)来改变回调事件。&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />#include &amp;lt;FL/Fl.H&amp;gt;<br /><br />#include &amp;lt;FL/Fl_Window.H&amp;gt;<br />#include &amp;lt;FL/Fl_Button.H&amp;gt;<br />#include &amp;lt;FL/Fl_ask.H&amp;gt;<br />void Btn01_cb(Fl_Widget *w, void *data)<br />{<br />  fl_alert(&quot;Hello&quot;);<br /> }<br />int main(int argc, char **argv)<br /> {<br /> char *buff = &quot;Hello&quot;;<br /> Fl_Window* w = new Fl_Window(272, 144);<br /> Fl_Button* Btn01 = new Fl_Button(85, 50, 105, 25, &quot;&amp;amp;Test callback&quot;);<br /> Btn01-&amp;gt;shortcut(FL_ALT + &#39;t&#39;);<br /> Btn01-&amp;gt;callback((Fl_Callback*) Btn01_cb, buff);<br /> Btn01-&amp;gt;when(FL_WHEN_RELEASE_ALWAYS);<br /><br /> w-&amp;gt;end();<br /> w-&amp;gt;show(argc,  argv);<br />  return Fl::run();<br /><br />}<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br /><br />&lt;p&gt;编译运行程序,在按钮上按下鼠标左键,移动到按钮外,松开鼠标按键,仍然会弹出对话框,对比上面的两程序,看看有什么不同。&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;5&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;FLTK消息处理&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        &lt;p&gt;在FLTK中是通过Fl_Widegt::handle(),虚拟函数来处理系统的消息。我们可以查看Fltk的源代码来分析系统是怎样处理一些系统消息的,如按钮的消息处理&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />/*******************************************************<br />Fl_Button中处理消息的代码,省略了具体的处理代码<br />*******************************************************/<br />int Fl_Button::handle(int event) {<br />switch (event) <br />{<br />case FL_ENTER:<br />case FL_LEAVE:     return 1;<br />case FL_PUSH:         ……<br />case FL_DRAG:        ……<br />case FL_RELEASE:     ……<br />case FL_SHORTCUT:   ……<br />case FL_FOCUS :       ……<br />case FL_UNFOCUS :    ……<br />case FL_KEYBOARD :  ……<br />default:<br />return 0;<br />}<br />}<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br />         &lt;p&gt;可以看出了,系统的一些消息,都是在构件的handle()中进行处理的。&lt;/p&gt;<br />        &lt;p&gt;系统的主要消息有以下&lt;/p&gt;<br /><br />&lt;table border=&quot;1&quot; width=&quot;80%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;<br />        &lt;td&gt;鼠标事件消息&lt;/td&gt;<br />        &lt;td&gt;焦点事件消息&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_PUSH&lt;/td&gt;<br />        &lt;td&gt;FL_ENTER&lt;/td&gt;<br />&lt;/tr&gt;<br /><br />&lt;tr&gt;<br />        &lt;td&gt;FL_DRAG&lt;/td&gt;<br />        &lt;td&gt;FL_LEAVE&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_RELEASE&lt;/td&gt;<br />        &lt;td&gt;FL_FOCUS&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br /><br />        &lt;td&gt;FL_MOVE&lt;/td&gt;<br />        &lt;td&gt;FL_UNFOCUS&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;键盘事件消息&lt;/td&gt;<br />        &lt;td&gt;剪贴板事件消息&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_KEYBOARD&lt;/td&gt;<br /><br />        &lt;td&gt;FL_PASTE&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_SHORTCUT&lt;/td&gt;<br />        &lt;td&gt;FL_SELECTIONCLEAR&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr colspan=&quot;2&quot;&gt;<br />        &lt;td&gt;构件事件消息&lt;/td&gt;<br />&lt;/tr&gt;<br /><br />&lt;tr&gt;<br />        &lt;td&gt;FL_DEACTIVATE&lt;/td&gt;<br />        &lt;td&gt;FL_ACTIVE&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;FL_HIDE&lt;/td&gt;<br />        &lt;td&gt;FL_SHOW&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/tbody&gt;&lt;/table&gt;<br /><br />        <br />        &lt;p&gt;通过重载handle函数我们可扩充标准构件,下面是一个鼠标移动到上面就改变颜色的按钮的实现源代码。&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />#include &amp;lt;FL/Fl.H&amp;gt;<br />#include &amp;lt;FL/Fl_Window.H&amp;gt;<br />#include &amp;lt;FL/Fl_Button.H&amp;gt;<br />#include &amp;lt;FL/fl_ask.H&amp;gt; <br /><br />class EnterButton : public Fl_Button <br />{<br />  int handle(int e)<br /> {  switch (e)<br />   {<br />      case  FL_ENTER:<br />              color(FL_GREEN);<br />              labelsize(18); redraw(); <br />              return 1;<br />      case   FL_LEAVE:<br />             color(FL_GRAY);<br />             labelsize(18); redraw(); <br />             return 1; <br />      default:<br />            return Fl_Button::handle(e);         <br />}<br />}<br />public:  EnterButton(int  x,  int y,  int w, int  h, const char  *l ) <br />                        : Fl_Button(x,y,w,h,l) {   }<br />};<br />static void  cb(Fl_Widget* s,  void *data)<br />{<br />  fl_alert( &quot;Hello World&#33;&quot; );<br />}<br />int main(int argc, char **argv) <br />{<br />      Fl_Window* w  =  new  Fl_Window(130, 50);<br />      EnterButton *eBtn  =  new  EnterButton(25,50,120,25,&quot;HelloWorld&quot;);<br />      eBtn-&amp;gt;callback((Fl_Callback*)cb);<br />      w-&amp;gt;end();<br />      w-&amp;gt;show(argc, argv);<br />      return Fl::run();<br />}<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br /><br />&lt;p&gt;运行显示效果如图:&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image010.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;50&quot; width=&quot;130&quot;&gt; &lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image011.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;50&quot; width=&quot;130&quot;&gt;&lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt;         <br />&lt;p&gt;Linux下演示[截屏时鼠标没有取到]&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image013.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;76&quot; width=&quot;142&quot;&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image015.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;74&quot; width=&quot;134&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt;<br />  <br /><br />&lt;p&gt;&lt;a name=&quot;6&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;FLUID简介&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        <br />&lt;p&gt;FLUID (FLTK UserInteface Designer)是FLTK进行程序界面设计的有力工具,如同GTK界面开发工具Glade一样。&lt;/p&gt;<br />&lt;p&gt;它包含在FLTK源代码中,需要自己编译成可执行文件。在Window平台可以使用VC/BC编译成可执行文件。启动和设计时界面如图所示:&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image017.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;342&quot; width=&quot;517&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image019.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;351&quot; width=&quot;529&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br />        &lt;p&gt;Fluid<br />非常容易使用,首先是新建,输入文件名,后点Bin 窗口的Function<br />图标,建立main主函数[清空name就可以],然后可以选择window<br />图标,建立窗口,然后拖放其他构件,可以在双击构件设置构件的属性【如下图】,在GUI属性页中设置标签和快捷键,位置大小,图片,提示,对齐方式等,在<br />style中设置它的显示风格等,在C++中设置名字,书写它的回调函数等。&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image020.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;418&quot; width=&quot;391&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br />        &lt;p&gt;设计好界面后,我们可以把这些转换为C++源代码,选菜单File中的write Code即可,使用编辑器可以打开与工程同名的源文件和头文件,怎么做,不再赘述。&lt;/p&gt;<br /><br />&lt;p&gt;&lt;a name=&quot;7&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;OpenGL编程&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        &lt;p&gt;在FLTK中很容易使用OpenGL进行图形编程的,我们只需要使用它的Fl_Gl_Window构件,重新定义一个派生于Fl_Gl_Window的类,重载draw()和handle()就可以。所需要的代码和步骤如下:&lt;/p&gt;<br />         &lt;p&gt;&lt;b&gt;包含以下头文件&lt;/b&gt;&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />#include &amp;lt;FL/Fl.H&amp;gt;<br />#include &amp;lt;FL/gl.h&amp;gt;<br />#include &amp;lt;FL/Fl_Gl_Window.H&amp;gt;<br /><br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br />         &lt;p&gt;&lt;b&gt;定义一个子类,如下代码所示&lt;/b&gt;&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />class MYGLWindow : public Fl_Gl_Window<br />{<br />        void draw(); //作图操作<br />    void handle( int ); //消息事件处理<br />        public : <br />                MYGLWindow(int x,int y,int w,int h,const char *L) : Fl_Gl_Window(x,y,w,h,L){};<br /><br />};<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br />         &lt;p&gt;&lt;b&gt;实现draw()事件&lt;/b&gt;&lt;/p&gt;<br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />void MYGLWindow::draw() //作图<br />{<br />        if ( &#33; valid() )<br />                {<br />          //设置viewport窗口大小等等 例如<br />        /********************************************** <br />valid(1);<br />        glLoadIdentity();<br />        glViewport(0,0,w(),h());<br />        ***********************************************/<br />                }<br />           //添加使用OPENGL作图操作 <br />          /* ……..*/<br />};<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br />         &lt;p&gt;&lt;b&gt;事件处理实现&lt;/b&gt;&lt;/p&gt;<br /><br />&lt;table bgcolor=&quot;#cccccc&quot; border=&quot;1&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;code&gt;<br />void MYGLWindow::handle( int event) //事件处理<br />{  switch (event)<br /> {  case FL_PUSH :  //操作等<br />                return 1;<br />    case …….<br />}<br />}<br />&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;<br />         &lt;p&gt;&lt;b&gt;注意&lt;/b&gt;&lt;/p&gt;<br />&lt;p&gt;1.        编译时需要包含openGL32的库文件,名字在不同的平台名字稍微不同。&lt;/p&gt;<br />&lt;p&gt;2.        使用&amp;lt;FL/gl.h&amp;gt;代替&amp;lt;GL/gl.h&amp;gt;头文件,不要使用后者的头文件。&lt;/p&gt;<br />        &lt;p&gt;例子程序比较长,附在参考中。运行显示,弹出菜单后如图所示:&lt;/p&gt;<br /><br /> <br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image022.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;288&quot; width=&quot;288&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;8&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;VC中使用FLTK&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        &lt;p&gt;在Vc中无法直接使用FLTK,需要下载FLTK的源文件编译之后再进行一些简单的设置,设置步骤如下:&lt;/p&gt;<br />&lt;p&gt;1.        打开Project-&amp;gt;Settings-&amp;gt;Link, 添加以下库文件: &lt;br&gt;<br />wsock32.lib opengl32.lib glu32.lib fltk.lib fltkgl.lib &lt;br&gt;<br />[fltk.lib fltkgl.lib 需要自己编译FLTK源文件生成,直接打开源文件下的visualc目录下的工程文件就可以编译]&lt;/p&gt;<br /><br />&lt;p&gt;2.        在Project-&amp;gt;Settings-&amp;gt;Link的PROJECT OPTIONS中 添加 /nodefaultlib:&quot;LIBCD&quot;,如果你要生成release版本的那么是 /nodefaultlib:&quot;LIBC&quot;&lt;/p&gt;<br />&lt;p&gt;3.        在Tools-&amp;gt;Options-&amp;gt;Directories, 选择 include files  添加路径如&lt;br&gt;<br />  C:\Program Files\fltk   [对照自己的修改]&lt;/p&gt;<br />&lt;p&gt;4.        在Tools-&amp;gt;Options-&amp;gt;Directories, 选择 library files 设定为如下所示&lt;br&gt;<br />C:\Program Files\fltk\lib [对照自己的修改]&lt;/p&gt;<br /><br />&lt;p&gt;5.        Project-&amp;gt;Settings-&amp;gt;C/C++ 中的category 选择 C++ Language&lt;/p&gt;<br />&lt;p&gt;6.        在Project-&amp;gt;Settings-&amp;gt;C/C++,的PROJECT OPTIONS添加:&lt;br&gt;<br />/I &quot;c:\program files\fltk&quot;  [对照修改],此处不修改也可以编译&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;9&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;KDevelop中使用FLTK&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br />        &lt;p&gt;作为跨平台的一种轻量级的GUI Tools,在Linux下得到更为广泛的使用,所以我们使用Linux下的最常用的Kdevelop也能很方便使用它。下面简述需要注意的配置步骤:&lt;/p&gt;<br />&lt;p&gt;1.        我们建立C++工程后,需要修改的配置都在菜单[项目]--&amp;gt;[选项]&#39;[连接器选项]中修改&lt;/p&gt;<br /><br />&lt;p&gt;2.        在[库]中选定 X11和Xext,根据自己的需要还需要选定 math等库&lt;/p&gt;<br />&lt;p&gt;3.        在[附加库]那里输入 -L/usr/X11R6/lib -lfltk &lt;/p&gt;<br />&lt;p&gt;4.        如果开发OpenGL应用需要 在附加库中输入 -lfltk_gl -lglut 指定连接库。&lt;/p&gt;<br />&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www-900.ibm.com/developerWorks/cn/linux/l-fltk/images/image024.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; height=&quot;343&quot; width=&quot;533&quot;&gt; &lt;br&gt; &lt;/center&gt;&lt;p&gt;&lt;/p&gt; <br />&lt;p&gt;提示:因为我使用的Linux为RedHat 8,为选择中文环境,所以配置说明也是中文,英文版本可能有所不同,对照修改即可.&lt;/p&gt;<br />&lt;p&gt;&lt;a name=&quot;resources&quot;&gt;&lt;span class=&quot;atitle2&quot;&gt;参考资料&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;<br /><br />&lt;p&gt;1.        想了解更多的FLTK的知识和下载FLTK源代码等可以到&lt;a href=&quot;http://www.fltk.org&quot;&gt;www.fltk.org&lt;/a&gt; 网站。<br /><br />&lt;a href=&quot;http://www.fltk.org/documentation.php&quot;&gt;FLTK的编程手册&lt;/a&gt; 你想了解FLTK构件的事件方法等都在里面。OpenGL&lt;/p&gt;<br />&lt;p&gt;2.        还是参考一下 &lt;a href=&quot;http://www.opengl.org&quot;&gt;www.opengl.org&lt;/a&gt; 上的资料吧,有文档说明还有教学和源代码。&lt;/p&gt;

2004-9-22 22:44 无双
fltk的优点是小 另外开发简单<br /><br />可惜就是官方版本还不支持中文<br /><br />过几天把以前写的例子放上来补充一下

2007-6-16 15:16 yangfanms
我现在要用fltk完成如下一个任务:实时读取空间内刀具的位置,然后在fltk中分别显示其xyz坐标,并在旁边的3d坐标里实时画图。请问,是否用Fl_Timer来完成这一实时应用?我是个新手,不会用Fl_Timer,能否给我个例子呢?还有就是,关于3d坐标画图,能否也给个例子?最好二者合在一起:)
不好意思,问了这么多,但是刚起步,导师就催我交,我想有个例子会很快上手,谢谢你。麻烦了。

页: [1]
查看完整版本: fltk介绍


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.