FLTKについて.ここではStable ReleaseであるFLTK1.3を対象として解説する.
FLTKとは†
FLTKはクロスプラットフォームのGUIツールキットである(Linux/Windows/Mac OS Xに対応).
ひととおりのGUIを構築することができ,さらにとても軽い(コンパイルや動作)という特徴がある.
また,プログラム自体も非常にすっきりとしている.
例えば,以下はFLTK1.3のドキュメントの最初の方に書かれているHello Worldである.
#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上で実行した様子を示す.
このようにとても簡単にGUIを構築できる.
FLTKのビルド†
- ダウンロード
ここからfltk-1.3.*-source.tar.gzをダウンロード.
- ビルド
- ダウンロードしたファイルを解凍.
- 解凍したフォルダのideフォルダにWindows,MacのIDE用のファイルがある.ここではVisual Studio 2010でビルドする.
ソリューションファイル ide\VisualC2010\fltk.sln をVS2010で開く
- 必要に応じてプロジェクトの設定などを編集し,ビルドする.
- インストール
- インクルードファイル : 解凍フォルダ直下の"FL"フォルダをフォルダごとインクルードディレクトリに.
- ライブラリファイル : Releaseの場合,libフォルダに以下のライブラリファイルが生成される.
fltk.lib, fltkforms.lib, fltkgl.lib, fltkimages.lib, fltkjpeg.lib, fltkpng.lib, fltkzlib.lib
Debugの場合は名前の最後に"d"が付く.
FLTK+OpenGL†
ダイアログ†
FLTKに関するメモ†
OpenGL capability†
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()関数で調べることができる.
メニューのショートカットキー†
Fl_Menu_Bar
でメニュー項目を追加した際,キーボードショートカットを設定できる.
以下の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コードを直接指定する.
修飾キー†
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)にあたる.
特殊キー†
矢印やPage Up/Down, EnterなどのキーはFLTKの定義で指定する.
キー | 定義 |
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 |
ファンクションキー†
ファンクションキーは
FL_F
に数字を足すことで指定する.例えば,F1キーは,
FL_F+1
である.対応するファンクションキーの範囲は,
FL_F_Last
で調べることができる.
フルスクリーン†
ウィンドウをフルスクリーンにするには
Fl_Window::fullscreen()
関数を用いる(最大化とは異なることに注意).
元に戻すときは,
fullscreen_off(int x, int y, int w, int h)
を用いる.fullscreen_off関数にはウィンドウ位置,サイズを渡す必要があるので,
フルスクリーン化したときに元々の位置,サイズを記録しておかなければならない.
以下にフルスクリーンを切り替える関数の例を示す.
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()を呼び出す.
よく使うウィジット†
- チェックボックス : Fl_Check_Button
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
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
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
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
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
- ラジオボタン : Fl_Round_Button
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
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);
リンク†