1. keyboard event handle 順序
在 Fl.css line 777 寫著
    // Try it as keystroke, sending it to focus and all parents:
    for (wi = grab() ? grab() : focus(); wi; wi = wi->parent())
      if (send(FL_KEYBOARD, wi, window)) return 1;
表示 keystroke event 會從 focus widget 一層一層往上傳,直到有 widget 處理。

2. FLTK 父子關係
    win = new MyWindow(WIN_X, WIN_Y, WIN_WIDTH, WIN_HEIGHT);
    {
        tabs = new Fl_Tabs(TAB_X, TAB_Y, TAB_WIDTH, TAB_HEIGHT);
        {
            Fl_Group *aaa = new Fl_Group(GROUP_X, GROUP_Y, GROUP_WIDTH, GROUP_HEIGHT);
            {
                MyButton *b1 = new MyButton(50, 160,90,25,"Button A1"); b1->color(88+1);
            }
            aaa->end();
            Fl_Group *bbb = new Fl_Group(GROUP_X, GROUP_Y, GROUP_WIDTH, GROUP_HEIGHT);
            {
                MyButton *b2 = new MyButton(50, 160,90,25,"Button A1"); b1->color(88+1);
            }
            bbb->end();
        }
        tabs->end();
    }
    win->end();
從以上的程式來看,父子關係依序為 win->tabs->aaa->b1 及 win->tabs->bbb->b2。也就 b1->parent() 為 aaa,aaa->parent() 為 tabs,tabs->parent() 為 win。

3. 在原始 FLTK 1.1.7 source 裏,當 b1 收到 Fl_Right event 時,會回傳 0。所以在第一點中的 send 函數會將 event 傳到 aaa 裏。但因為 Fl_Group 沒有可以移動的 widget ,所以也會傳回 0。所以第一點中的 send 函數會再將 event 傳到 tabs 裏。而 tabs 就會把 focus 移到 bbb,再回傳1。如此終止此 event ,而不會傳到 win。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()