#author("2024-03-11T15:10:42+09:00","default:pbcglab_user","pbcglab_user")
FLTKについて.ここではStable ReleaseであるFLTK1.3を対象として解説する.

----
#contents
----

*FLTKとは [#k5d9e07d]
FLTKはクロスプラットフォームのGUIツールキットである(Linux/Windows/Mac OS Xに対応).
ひととおりのGUIを構築することができ,さらにとても軽い(コンパイルや動作)という特徴がある.
また,プログラム自体も非常にすっきりとしている.
例えば,以下は[[FLTK1.3のドキュメント:http://www.fltk.org/doc-1.3/index.html]]の最初の方に書かれているHello Worldである.
#code(C){{
#code_x{{
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>

int main(int argc, char **argv)
{
	Fl_Window *window = new Fl_Window(340,180);
	Fl_Box *box = new Fl_Box(20,40,300,100,"Hello, World!");
	box->box(FL_UP_BOX);
	box->labelfont(FL_BOLD+FL_ITALIC);
	box->labelsize(36);
	box->labeltype(FL_SHADOW_LABEL);
	window->end();
	window->show(argc, argv);
	return Fl::run();
}
}}
ウィンドウを作り,"Hello, World!"というラベルのボックスを生成し,ラベルフォントなどの設定を行い,ウィンドウを表示させている.Fl_Windowクラスがウィンドウを生成するクラスであり,newでクラスオブジェクトを生成してから,
13行目でend関数を呼び出すまでの間に生成されたウィジットがウィンドウ上に配置される.
この例ではFl_Window上にFl_Box(ボックス型ウィジット)を配置している.
end関数を呼び出した後,show関数によりウィンドウを可視化し,Fl::run()を呼び出すことでメインループに入る.

以下にWindows 7上で実行した様子を示す.

#ref(fltk_hello_world.jpg,nolink,80%)

このようにとても簡単にGUIを構築できる.

*FLTKのビルド [#xc89191c]
#include(build_fltk,title)

*FLTK+OpenGL [#n32bc623]

-[[Fl_Gl_Windowの派生クラスによるOpenGL描画]]
-[[Fl_Gl_Windowでのキーボード・マウス入力]]
-[[Fl_Gl_Windowでのアニメーション]]

-[[Fl_Gl_Window以外のFLTKウィンドウでOpenGLを使う]]
-[[GLUT互換モード]]

-[[FLTK+OpenGLのアプリケーション例]]


*ダイアログ [#g98efc58]
-[[モーダルダイアログの生成]]

*FLTKに関するメモ [#z1080ae1]
**OpenGL capability [#u751a447]
OpenGLのキャンバスは様々なモードを設定できる
(GLUTのglutInitDisplayModeでGLUT_RGBAやGLUT_DOUBLEなどを設定するのと同じもの).
モードを設定するにはFl_Gl_Windowクラスのmode関数を用いる.
mode関数の引数に設定できるフラグは以下.
--FL_RGB : RGBカラー
--FL_RGB8 : 各色8bitのRGBカラー(通常FL_RGB=FL_RGB8)
--FL_INDEX : インデックスカラー
--FL_SINGLE : ダブルバッファOFF
--FL_DOUBLE : ダブルバッファON
--FL_ACCUM : アキュムレーションバッファ
--FL_ALPHA : アルファチャンネル
--FL_DEPTH : デプスバッファ
--FL_STENCIL : ステンシルバッファ
--FL_MULTISAMPLE : マルチサンプリングによるアンチエリアシング

例
 Fl_Gl_Window win = new Fl_Gl_Window(0, 0, 100, 100, 0);
 win->mode(FL_RGB | FL_ALPHA | FL_DOUBLE | FL_DEPTH | FL_MULTISAMPLE);

設定したモードが実行環境上で使えるかどうかは,
[[Fl_Gl_Window::can_do():http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#a351d72f872e59ac05ca06fd65cdc25c7]]関数で調べることができる.


**メニューのショートカットキー [#q55e4060]
[[Fl_Menu_Bar:http://www.fltk.org/doc-1.3/classFl__Menu__Bar.html]]
でメニュー項目を追加した際,キーボードショートカットを設定できる.
以下のadd関数の第2引数でショートカットキーを設定する.
 int Fl_Menu_::add(const char* label,
                   int shortcut,
                   Fl_Callback* callback,
                   void* userdata = 0,
                   int flags = 0)
shortcutに0を渡すとショートカットキーなし.
設定する場合は,'a'や97のようにASCIIコードを直接指定する.

***修飾キー [#l11fc02c]
CTRLやSHIFT,ALTキーなどの修飾キーと組み合わせる場合は,
FL_CTRL+'a'のように整数で指定するか,文字列で"^a"などと指定する.
ここで,"^"がCTRLキーを示している.また,SHIFTキーの場合は'A'のように大文字にすると"SHIFT+A"となる.
修飾キーのコードを以下に示す.
|キー|int|string|
|CTRL|FL_CTRL| ^ |
|SHIFT|FL_SHIFT| + |
|ALT|FL_ALT| # |
|Windowsキー|FL_META|なし|

Mac OS Xだと,CommandキーがFL_META (or FL_COMMAND),ControlキーがFL_CTRL (or FL_CONTROL)にあたる.

***特殊キー [#a1953c8e]
矢印やPage Up/Down, EnterなどのキーはFLTKの定義で指定する.
| キー | 定義 |h
| Back Space | FL_BackSpace |
| Tab | FL_Tab |
| Enter | FL_Enter |
| Pause | FL_Pause |
| Scroll Lock | FL_Scroll_Lock |
| Esc | FL_Escape |
| ← | FL_Left |
| ↑ | FL_Up |
| → | FL_Right |
| ↓ | FL_Down |
| Page Up | FL_Page_Up |
| Page Down | FL_Page_Down |
| Home | FL_Home |
| End | FL_End |
| Print Screen | FL_Print |
| Insert | FL_Insert |
| Delete | FL_Delete |
| Num Lock | FL_Num_Lock |
| Caps Lock | FL_Caps_Lock |


***ファンクションキー [#f57e99c7]
ファンクションキーは
 FL_F
に数字を足すことで指定する.例えば,F1キーは,
 FL_F+1
である.対応するファンクションキーの範囲は,
 FL_F_Last
で調べることができる.

**フルスクリーン [#k282cbe6]
ウィンドウをフルスクリーンにするには
[[Fl_Window::fullscreen():http://www.fltk.org/doc-1.3/classFl__Window.html#ac3f59c5dfbf15d4ae5485c5a8c73b0c3]]
関数を用いる(最大化とは異なることに注意).
元に戻すときは,
 fullscreen_off(int x, int y, int w, int h)
を用いる.fullscreen_off関数にはウィンドウ位置,サイズを渡す必要があるので,
フルスクリーン化したときに元々の位置,サイズを記録しておかなければならない.

以下にフルスクリーンを切り替える関数の例を示す.
#code(C){{
void rxFlWindow::SwitchFullScreen(void)
{
	static int is_fullscreen = 0;
	static int pos0[2] = { 0, 0 };
	static int win0[2] = { 500, 500 };
	if(is_fullscreen){
		fullscreen_off(pos0[0], pos0[1], win0[0], win0[1]);
		is_fullscreen = 0;
	}
	else{
		pos0[0] = x();
		pos0[1] = y();
		win0[0] = w();
		win0[1] = h();
		fullscreen();
		is_fullscreen = 1;
	}
}
}}

ちなみに [[FLTK+OpenGLのアプリケーション例]] のようにOpenGLウィンドウ(Fl_Gl_Window)をウィジットとしてFl_Double_Windowに登録した場合,Fl_Gl_Window(の派生クラス)内でfullscreen()を呼び出しても,Fl_Double_Window内でウィジットが最大化されるだけである.もし,OpenGL描画部分のみをフルスクリーン化したいならば,Fl_Double_Window(の派生クラス)内でfullscreen()でウィンドウ全体をフルスクリーン化(この時点ではメニューやボタン,ステータスバーも含めてフルスクリーン化される)した後,Fl_Gl_Windowクラス(の派生クラス)内でfullscreen()を呼び出す必要がある.元に戻す場合は逆の手順でfullscreen_off()を呼び出す.

**よく使うウィジット [#s803d416]
-チェックボックス : [[Fl_Check_Button:http://www.fltk.org/doc-1.3/classFl__Check__Button.html]]
#code(C){{
	Fl_Check_Button *check;
	check = new Fl_Check_Button(xs, ys, 25, 25, " check");
	check->down_box(FL_DOWN_BOX);
	check->callback(OnCheckInertia_s, this);
	check->align(Fl_Align(FL_ALIGN_RIGHT));	// FL_ALIGN_LEFTでチェックの左にラベル
}}

-ボタン : [[Fl_Button:http://www.fltk.org/doc-1.3/classFl__Button.html]]
#code(C){{
	Fl_Button *button;
	button = new Fl_Button(xs, ys, ws, hs, "button");
	button->callback(OnButton_s, this);
	button->down_box(FL_FLAT_BOX);
	button->clear_visible_focus();
}}

-ボックス : [[Fl_Box:http://www.fltk.org/doc-1.3/classFl__Box.html]]
#code(C){{
	Fl_Box *box;
	box = new Fl_Box(xs, ys, ws, hs);
	box->box(FL_FLAT_BOX);
	box->align(FL_ALIGN_INSIDE | FL_ALIGN_WRAP | FL_ALIGN_LEFT);
	box->label("box");
}}

-スライダー : [[Fl_Value_Slider:http://www.fltk.org/doc-1.3/classFl__Value__Slider.html]]
#code(C){{
	Fl_Value_Slider *slider;
	slider = new Fl_Value_Slider(xs, ys, ws, hs, "slider ");
	slider->type(FL_FLOAT_INPUT);	// FL_FLOAT_INPUT or FL_INT_INPUT
	slider->callback(OnSlider_s, this);
	slider->minimum(0.0);
	slider->maximum(1.0);
	slider->step(0.01);
	slider->value(0.5);
	slider->align(Fl_Align(FL_ALIGN_LEFT));
}}

-スピンボックス : [[Fl_Spinner:http://www.fltk.org/doc-1.3/classFl__Spinner.html]]
#code(C){{
	Fl_Spinner *spin;
	spin = new Fl_Spinner(xs, ys, ws, hs, "spin ");
	spin->type(FL_INT_INPUT);
	spin->callback(OnSpin_s, this);
	spin->minimum(0);
	spin->maximum(10);
	spin->step(1);
	spin->value(5);
}}

-グループ : [[Fl_Group:http://www.fltk.org/doc-1.3/classFl__Group.html]]
-ラジオボタン : [[Fl_Round_Button:http://www.fltk.org/doc-1.3/classFl__Radio__Round__Button.html]]
#code(C){{
	Fl_Group *gr = new Fl_Group(xs, ys, ws, hs);
	{
		gr->box(FL_THIN_UP_FRAME);
		xs += 5; ys += 3;
		
		Fl_Round_Button *radio;
		radio = new Fl_Round_Button(xs, ys, ws, hs, "radio1");
		radio->type(102);
		radio->down_box(FL_ROUND_DOWN_BOX);
		radio->callback(OnRadio_s, this);
		radio->value(1);

		radio = new Fl_Round_Button(xs, ys+1*(hs+1), ws, hs, "radio2");
		radio->type(102);
		radio->down_box(FL_ROUND_DOWN_BOX);
		radio->callback(OnRadio_s, this);

		radio = new Fl_Round_Button(xs, ys+2*(hs+1), ws, hs, "radio3");
		radio->type(102);
		radio->down_box(FL_ROUND_DOWN_BOX);
		radio->callback(OnRadio_s, this);

		gr->end();
		gr->resizable(0);
	}
}}

-ローラー : [[Fl_Roller:http://www.fltk.org/doc-1.3/classFl__Roller.html]]
#code(C){{
	Fl_Roller *roller;
	roller = new Fl_Roller(xs, ys, width, len);
	roller->type(FL_VERTICAL);	// FL_VERTICAL or FL_HORIZONTAL
	roller->callback(OnRollerX_s, this);
	roller->value(0.5);
}}


*リンク [#a63102ae]
-[[FLTK:http://www.fltk.org/index.php]]
-[[Beginner FLTK Tutorial:http://www3.telus.net/public/robark/]]
-[[Erco's FLTK Cheat Page:http://www.seriss.com/people/erco/fltk/]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS