## 1.5FLTK消息处理
在FLTK中是通过Fl_Widegt::handle(),虚拟函数来处理系统的消息。我们可以查看Fltk的源代码来分析系统是怎样处理一些系统消息的,如按钮的消息处理
```
/*******************************************************
Fl_Button中处理消息的代码,省略了具体的处理代码
*******************************************************/
int Fl_Button::handle(int event) {
switch (event)
{
case FL_ENTER:
case FL_LEAVE: return 1;
case FL_PUSH: ……
case FL_DRAG: ……
case FL_RELEASE: ……
case FL_SHORTCUT: ……
case FL_FOCUS : ……
case FL_UNFOCUS : ……
case FL_KEYBOARD : ……
default:return 0;
}
}
```
可以看出了,系统的一些消息,都是在构件的handle()中进行处理的。
系统的主要消息有以下
| 鼠标事件消息 | 焦点事件消息 |
| --- | --- |
| FL_PUSH | FL_ENTER |
| FL_DRAG | FL_LEAVE |
| FL_RELEASE | FL_FOCUS |
| FL_MOVE | FL_UNFOCUS |
| 键盘事件消息 | 剪贴板事件消息 |
| --- | --- |
| FL_KEYBOARD | FL_PASTE |
| FL_SHORTCUT | FL_SELECTIONCLEAR |
| 构件事件消息 | |
| --- | --- |
| FL_DEACTIVATE | FL_ACTIVE|
| FL_HIDE | FL_SHOW|
通过重载handle函数我们可扩充标准构件,下面是一个鼠标移动到上面就改变颜色的按钮的实现源代码。
```
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/fl_ask.H>
class EnterButton : public Fl_Button
{
int handle(int e)
{
switch (e)
{
case FL_ENTER:
color(FL_GREEN);
labelsize(18);
redraw();
return 1;
case FL_LEAVE:
color(FL_GRAY);
labelsize(18);
redraw();
return 1;
default: return Fl_Button::handle(e);
}
}
public:
EnterButton(int x, int y, int w, int h, const char *l ) : Fl_Button(x,y,w,h,l) {}
};
static void cb(Fl_Widget* s, void *data)
{
fl_alert( "Hello World!" );
}
int main(int argc, char **argv)
{
Fl_Window* w = new Fl_Window(130, 50);
EnterButton *eBtn = new EnterButton(25,50,120,25,"HelloWorld");
eBtn->callback((Fl_Callback*)cb);
w->end();
w->show(argc, argv);
return Fl::run();
}
```
运行显示效果如图:
![](https://box.kancloud.cn/2016-01-09_5690737f1f71a.png)
Linux下演示(截屏时鼠标没有取到)
![](https://box.kancloud.cn/2016-01-09_5690737f32172.png)
- 第一章:FLTK编程模型
- 1.1FLTK功能简介
- 1.2搭建FLTK开发环境
- 1.3FLTK构件简介
- 1.4FLTK事件处理
- 1.5FLTK消息处理
- 1.6OpenGL编程
- 第二章:常用的控件和属性
- 2.1按钮
- 2.2文本
- 2.3颜色
- 2.4Box类型
- 第三章:FLTK的画图函数
- 3.1何时可以画图
- 3.2 FLTK的画图函数
- 3.3剪切
- 3.4颜色
- 3.5设置线条的属性
- 3.6画一般的图形函数
- 3.7画封闭的线,一次连接个顶点
- 3.8画三边形或四边形,并填充内部
- 3.9复杂图形函数
- 3.10字体
- 3.11覆盖画图函数
- 第四章:在FLTK中自定义控件
- 4.1定制图形控件说明
- 4.2如何开发一个控件的子类
- 4.3处理事件
- 4.4画控件