ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 4.4画控件 当FLTK需要重画控件时将调用虚拟函数draw().只有在damage()返回非0值时调用该函数,draw()返回后,damage()被清0。Draw()应该被声明为保护成员函数,避免在不需要写画图代码时用到。 Damage()将包含从最后一次调用draw()后damage(n)调用产生的所有与或位信息,根据该信息只重画需要重画的位置,只有FLTK认为需要全部重画时才打开FL_DAMAGE_ALL位,比如收到expose事件。 ### 修改控件的尺寸 resize(int x,int y,int w,int h)在控件被移动和改变大小时被调用,这些参数分别是新位置,宽度和高度。但是x(),y(),w(),h(),还是以前的值,若要改变这些值,必须在基类中也调用resize()函数 不需要调用redraw()函数,至少只改变x(),y()时不需要,因为一个组合控件有一套更有效的方法来画新的位置 ### 如何制作一个组合控件 一个组合控件包括一个或多个子控件。制作组合控件必须继承Fl_Group类.不继承Fl_Group类当然也可能可以制作一个组合控件,但是你还是要重新写Fl_Group类里面的工作 子控件可能在类里面声明 ``` class MyClass : public Fl_Group { Fl_Button the_button; Fl_Slider the_slider; ... }; ``` 构造函数要初始化这些子控件。他们将被自动的add()到group中。因为Fl_Group构造函数调用了begin().在构造函数中不要忘记调用end()函数 ``` MyClass::MyClass(int x, int y, int w, int h) : Fl_Group(x, y, w, h), the_button(x + 5, y + 5, 100, 20), the_slider(x, y + 50, w, 20) { ...(you could add dynamically created child widgets here)... end(); // don't forget to do this! } ```