差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| fltk:widget-basic-menus [2025/06/14 05:13] – [Fl_Menu_Barクラス] Fix wrong close tag of code freemikan | fltk:widget-basic-menus [2025/06/14 12:25] (現在) – [Fl_Menu_Buttonクラス] Write body text freemikan | ||
|---|---|---|---|
| 行 19: | 行 19: | ||
| 具体的な用途によって、Fl_Menu_Barクラス、Fl_Menu_Buttonクラス、Fl_Choiceクラスが派生クラスとして提供されています。 | 具体的な用途によって、Fl_Menu_Barクラス、Fl_Menu_Buttonクラス、Fl_Choiceクラスが派生クラスとして提供されています。 | ||
| + | [[https:// | ||
| + | <WRAP centeralign> | ||
| - | < | ||
| - | < | ||
| - | [[https:// | ||
| - | </ | ||
| ==== Fl_Menu_Barクラス ==== | ==== Fl_Menu_Barクラス ==== | ||
| + | [[https:// | ||
| + | <WRAP centeralign> | ||
| + | |||
| + | |||
| + | 典型的なGUIアプリケーションで目にする、ウィンドウ最上部のメニューバーを実現するためのクラスです。 | ||
| + | FLTKではメニューバーもやはりウィジェットです。 | ||
| + | サイズや位置を設定することができるので、必ずしもウィンドウの最上部に配置しなければならないことはありません。 | ||
| + | この自由度は一方であまり直感的とは言えない使い方が求められます。 | ||
| + | 例えば、次のようなことが考えられます。 | ||
| + | |||
| + | * メニューバーの初期サイズにウィンドウのサイズと同じだけの幅とUIフォントのサイズを考慮した高さを与えることが必須である。 | ||
| + | * ユーザーがマウスでウィンドウの枠をドラッグしてサイズを変更したときにメニューバーが縦に拡大されることを回避するよう配慮しないといけない。 | ||
| + | |||
| + | 次のサンプルプログラムでは、メニューバーの構築方法と、ウィンドウのサイズ変更に対して自然な振る舞いになるようにする方法を示しています。 | ||
| <code cpp> | <code cpp> | ||
| #include < | #include < | ||
| - | #include <FL/Fl_Flex.H> | + | #include <FL/Fl_File_Chooser.H> |
| #include < | #include < | ||
| #include < | #include < | ||
| - | #include < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| - | #include < | ||
| #include < | #include < | ||
| 行 67: | 行 77: | ||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||
| - | auto window = new Fl_Window{400, | + | auto window = new Fl_Window{400, |
| auto menu_bar = new Fl_Menu_Bar{0, | auto menu_bar = new Fl_Menu_Bar{0, | ||
| 行 83: | 行 93: | ||
| menu_bar-> | menu_bar-> | ||
| + | // マウスでドラッグしてウィンドウのサイズを変更できるようにする | ||
| + | // ただし、メニューバーの高さは変化しないようにする | ||
| + | // メニューバーの領域を含めないことがポイント | ||
| auto group = new Fl_Group{0, menu_bar-> | auto group = new Fl_Group{0, menu_bar-> | ||
| group-> | group-> | ||
| - | |||
| window-> | window-> | ||
| + | |||
| window-> | window-> | ||
| window-> | window-> | ||
| 行 104: | 行 117: | ||
| ==== Fl_Menu_Buttonクラス ==== | ==== Fl_Menu_Buttonクラス ==== | ||
| + | [[https:// | ||
| + | <WRAP centeralign> | ||
| + | |||
| + | Fl_Menu_Buttonクラスのウィジェットは、クリックすると選択項目が表示されるドロップダウン形式のボタンです。 | ||
| + | また、メンバ関数type()でポップアップのタイプを設定することによってポップアップメニューとして利用できます。 | ||
| + | これによって、多くのGUIアプリケーションやウィンドウシステムが採用している典型的な右クリックメニューを実現できます。 | ||
| <code cpp> | <code cpp> | ||
| #include < | #include < | ||
| - | #include < | ||
| - | #include < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| 行 115: | 行 132: | ||
| #include < | #include < | ||
| + | // ダミーのコールバック | ||
| void the_cb(Fl_Widget *w, void *data) {} | void the_cb(Fl_Widget *w, void *data) {} | ||
| void strange_cb(Fl_Widget *w, void *data) {} | void strange_cb(Fl_Widget *w, void *data) {} | ||
| 行 122: | 行 140: | ||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||
| - | auto window = new Fl_Window{400, | + | auto window = new Fl_Window{400, |
| // https:// | // https:// | ||
| - | Fl_Menu_Item | + | Fl_Menu_Item |
| - | {"& | + | |
| - | {" | + | |
| - | {"& | + | |
| - | {"& | + | |
| - | {"& | + | |
| - | {" | + | |
| - | {" | + | |
| - | {" | + | |
| - | {" | + | |
| - | {" | + | |
| - | {0}, | + | |
| - | {" | + | |
| - | {" | + | |
| - | {" | + | |
| - | {" | + | |
| - | {0}}; | + | |
| - | | + | |
| - | auto menu_button = new Fl_Menu_Button{0, 0, 0, 0, "& | + | auto menu_button = new Fl_Menu_Button{10, 10, 150, 30, "& |
| - | menu_button-> | + | menu_button-> |
| - | flex-> | + | |
| - | flex-> | + | |
| - | auto group = new Fl_Group{0, flex-> | + | |
| - | | + | // ボタンの位置とサイズがクリックの有効範囲となる |
| + | | ||
| + | menu_popup->menu(menu_table); | ||
| + | | ||
| - | window-> | ||
| window-> | window-> | ||
| window-> | window-> | ||
