## 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();
}
```
運行顯示效果如圖:

Linux下演示(截屏時鼠標沒有取到)

- 第一章: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畫控件