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上で実行した様子を示す.

fltk_hello_world.jpg

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

FLTKのビルド

  • ダウンロード
    ここからfltk-1.3.*-source.tar.gzをダウンロード.
  • ビルド
    1. ダウンロードしたファイルを解凍.
    2. 解凍したフォルダのideフォルダにWindows,MacのIDE用のファイルがある.ここではVisual Studio 2010でビルドする. ソリューションファイル ide\VisualC2010\fltk.sln をVS2010で開く
    3. 必要に応じてプロジェクトの設定などを編集し,ビルドする.
  • インストール
    • インクルードファイル : 解凍フォルダ直下の"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"となる. 修飾キーのコードを以下に示す.

キーintstring
CTRLFL_CTRL^
SHIFTFL_SHIFT+
ALTFL_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 SpaceFL_BackSpace
TabFL_Tab
EnterFL_Enter
PauseFL_Pause
Scroll LockFL_Scroll_Lock
EscFL_Escape
FL_Left
FL_Up
FL_Right
FL_Down
Page UpFL_Page_Up
Page DownFL_Page_Down
HomeFL_Home
EndFL_End
Print ScreenFL_Print
InsertFL_Insert
DeleteFL_Delete
Num LockFL_Num_Lock
Caps LockFL_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);

リンク


添付ファイル: filefltk_hello_world.jpg 1467件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-03-11 (月) 15:10:42