resizable()の規則に戸惑う...

画像を使って説明すれば楽なのですが、はてなはじゃんじゃん画像を置けないので、文字で許してください。

一般的な GUI ライブラリには、たいてい ALIGN_LEFT, ALIGN_RIGHT ... など、ウインドウが拡祝された際のアルゴリズムを指定できるようになっている。たしかに、align()という関数があるが、Widget内における文字のアライン指定であり、Widgetのアライン指定ではない。resizable() を駆使することで、ALIGN_LEFT... 等を再現できるようである。
基本的には resizable が指定されていると親の拡縮と同じ比率で拡縮されるようになる。resizable が指定されないと、できるだけ拡縮しないですむように手抜きなWidgetになってしまう。ここいらへんの resizable のルールがかなり分かりづらい。
どうも、以下のようなルールらしい...

  1. resizable( ? ) を呼ぶと、? のサイズが親のリサイズに合わせて変化する
  2. 誰も resizable() を呼ばないと、リサイズができない

ちなみに、以下のコードが正しく動くコード。ダブルバッファウインドウに、垂直・水平スクロールバーを取り付ける。リサイズ時には、垂直・水平スクロールーバーは、それぞれ「常識的」にリサイズされる。

Fl_Double_Window* win = new Fl_Double_Window( 10, 10, 200, 200 );
Fl_Box* box = new Fl_Box( 0, 0, 200 - 15, 200 - 15 );
win->resizable( *box );
Fl_Scrollbar* vbar = new Fl_Scrollbar( 200 - 15, 0, 15, 200 - 15 );
Fl_Scrollbar* hbar = new Fl_Scrollbar( 0, 200 - 15, 200 - 15, 15 );
hbar->type(FL_HORIZONTAL);
win->end();
win->show();

ちなみに、これでは、まったくリサイズできない。

Fl_Double_Window* win = new Fl_Double_Window( 10, 10, 200, 200 );
win->end();
win->show();

そして、これだと垂直・水平スクロールバーが「非常識」に拡縮される。

Fl_Double_Window* win = new Fl_Double_Window( 10, 10, 200, 200 );
Fl_Box* box = new Fl_Box( 0, 0, 200 - 15, 200 - 15 );
win->resizable( *win ); // win 以下なので、vbar, hbar もスケーリングされてしまう
Fl_Scrollbar* vbar = new Fl_Scrollbar( 200 - 15, 0, 15, 200 - 15 );
Fl_Scrollbar* hbar = new Fl_Scrollbar( 0, 200 - 15, 200 - 15, 15 );
hbar->type(FL_HORIZONTAL);
win->end();
win->show();

と、この解説自体も分かりづらい。慣れれば楽なんだろうけど、慣れるまではこの文章とfltkのマニュアルでがんばってください>後に続く人