差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
fltk:widget-basic-menus [2025/06/14 05:13] – [Fl_Menu_Barクラス] Fix wrong close tag of code freemikanfltk: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://www.fltk.org/doc-1.4/classFl__Menu__.html|{{ https://www.fltk.org/doc-1.4/classFl__Menu__.png |Fl_Menu_クラス前後の階層図}}]]
 +<WRAP centeralign>Fl_Menu_クラス前後の階層図</WRAP>
  
-<figure> 
-<caption>Fl_Menu_クラス前後のクラス階層図</caption> 
-[[https://www.fltk.org/doc-1.4/classFl__Menu__.html|{{ https://www.fltk.org/doc-1.4/classFl__Menu__.png |Fl_Menu_クラス前後のクラス階層図}}]] 
-</figure> 
  
 ==== Fl_Menu_Barクラス ==== ==== Fl_Menu_Barクラス ====
 +[[https://www.fltk.org/doc-1.4/classFl__Menu__Bar.html|{{ https://www.fltk.org/doc-1.4/classFl__Menu__Bar.png | Fl_Menu_Barクラス前後の階層図}}]]
 +<WRAP centeralign>Fl_Menu_Barクラス前後の階層図</WRAP>
 +
 +
 +典型的なGUIアプリケーションで目にする、ウィンドウ最上部のメニューバーを実現するためのクラスです。
 +FLTKではメニューバーもやはりウィジェットです。
 +サイズや位置を設定することができるので、必ずしもウィンドウの最上部に配置しなければならないことはありません。
 +この自由度は一方であまり直感的とは言えない使い方が求められます。
 +例えば、次のようなことが考えられます。
 +
 +  * メニューバーの初期サイズにウィンドウのサイズと同じだけの幅とUIフォントのサイズを考慮した高さを与えることが必須である。
 +  * ユーザーがマウスでウィンドウの枠をドラッグしてサイズを変更したときにメニューバーが縦に拡大されることを回避するよう配慮しないといけない。
 +
 +次のサンプルプログラムでは、メニューバーの構築方法と、ウィンドウのサイズ変更に対して自然な振る舞いになるようにする方法を示しています。
  
 <code cpp> <code cpp>
 #include <FL/Fl.H> #include <FL/Fl.H>
-#include <FL/Fl_Flex.H>+#include <FL/Fl_File_Chooser.H>
 #include <FL/Fl_Group.H> #include <FL/Fl_Group.H>
 #include <FL/Fl_Menu_Bar.H> #include <FL/Fl_Menu_Bar.H>
-#include <FL/Fl_Menu_Button.H> 
 #include <FL/Fl_Menu_Item.H> #include <FL/Fl_Menu_Item.H>
 #include <FL/Fl_Window.H> #include <FL/Fl_Window.H>
 #include <FL/fl_ask.H> #include <FL/fl_ask.H>
-#include <FL/Fl_File_Chooser.H> 
  
 #include <cstdio> #include <cstdio>
行 67: 行 77:
  
 int main(int argc, char **argv) { int main(int argc, char **argv) {
-  auto window = new Fl_Window{400, 400, "Menu demo"};+  auto window = new Fl_Window{400, 400, "Fl_Menu_Bar demo"};
  
   auto menu_bar = new Fl_Menu_Bar{0, 0, window->w(), 30, "Menu"};   auto menu_bar = new Fl_Menu_Bar{0, 0, window->w(), 30, "Menu"};
行 83: 行 93:
   menu_bar->menu_end();   menu_bar->menu_end();
  
 +  // マウスでドラッグしてウィンドウのサイズを変更できるようにする
 +  // ただし、メニューバーの高さは変化しないようにする
 +  // メニューバーの領域を含めないことがポイント
   auto group = new Fl_Group{0, menu_bar->h(), window->w(), window->h() - menu_bar->h()};   auto group = new Fl_Group{0, menu_bar->h(), window->w(), window->h() - menu_bar->h()};
   group->end();   group->end();
- 
   window->resizable(group);   window->resizable(group);
 +
   window->end();   window->end();
   window->show(argc, argv);   window->show(argc, argv);
行 104: 行 117:
  
 ==== Fl_Menu_Buttonクラス ==== ==== Fl_Menu_Buttonクラス ====
 +[[https://www.fltk.org/doc-1.4/classFl__Menu__Button.html|{{ https://www.fltk.org/doc-1.4/classFl__Menu__Button.png | Fl_Menu_Buttonクラス前後の階層図}}]]
 +<WRAP centeralign>Fl_Menu_Buttonクラス前後の階層図</WRAP>
 +
 +Fl_Menu_Buttonクラスのウィジェットは、クリックすると選択項目が表示されるドロップダウン形式のボタンです。
 +また、メンバ関数type()でポップアップのタイプを設定することによってポップアップメニューとして利用できます。
 +これによって、多くのGUIアプリケーションやウィンドウシステムが採用している典型的な右クリックメニューを実現できます。
  
 <code cpp> <code cpp>
 #include <FL/Fl.H> #include <FL/Fl.H>
-#include <FL/Fl_Flex.H> 
-#include <FL/Fl_Group.H> 
 #include <FL/Fl_Menu_Button.H> #include <FL/Fl_Menu_Button.H>
 #include <FL/Fl_Menu_Item.H> #include <FL/Fl_Menu_Item.H>
行 115: 行 132:
 #include <cstdio> #include <cstdio>
  
 +// ダミーのコールバック
 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, 400, "Menu demo"};+  auto window = new Fl_Window{400, 400, "Fl_Menu_Button demo"};
  
   // https://www.fltk.org/doc-1.4/structFl__Menu__Item.html#details   // https://www.fltk.org/doc-1.4/structFl__Menu__Item.html#details
-  Fl_Menu_Item popup[] = {{"&alpha", FL_ALT + 'a', the_cb, (void *)1}, +  Fl_Menu_Item menu_table[] = {{"&alpha", FL_ALT + 'a', the_cb, (void *)1}, 
-                          {"&beta", FL_ALT + 'b', the_cb, (void *)2}, +                               {"&beta", FL_ALT + 'b', the_cb, (void *)2}, 
-                          {"gamma", FL_ALT + 'c', the_cb, (void *)3, FL_MENU_DIVIDER}, +                               {"gamma", FL_ALT + 'c', the_cb, (void *)3, FL_MENU_DIVIDER}, 
-                          {"&strange", 0, strange_cb}, +                               {"&strange", 0, strange_cb}, 
-                          {"&charm", 0, charm_cb}, +                               {"&charm", 0, charm_cb}, 
-                          {"&truth", 0, truth_cb}, +                               {"&truth", 0, truth_cb}, 
-                          {"b&eauty", 0, beauty_cb}, +                               {"b&eauty", 0, beauty_cb}, 
-                          {"sub&menu", 0, 0, 0, FL_SUBMENU}, +                               {"sub&menu", 0, 0, 0, FL_SUBMENU}, 
-                          {"one"}, +                               {"one"}, 
-                          {"two"}, +                               {"two"}, 
-                          {"three"}, +                               {"three"}, 
-                          {0}, +                               {0}, 
-                          {"inactive", FL_ALT + 'i', 0, 0, FL_MENU_INACTIVE | FL_MENU_DIVIDER}, +                               {"inactive", FL_ALT + 'i', 0, 0, FL_MENU_INACTIVE | FL_MENU_DIVIDER}, 
-                          {"invisible", FL_ALT + 'i', 0, 0, FL_MENU_INVISIBLE}, +                               {"invisible", FL_ALT + 'i', 0, 0, FL_MENU_INVISIBLE}, 
-                          {"check", FL_ALT + 'i', 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE}, +                               {"check", FL_ALT + 'i', 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE}, 
-                          {"box", FL_ALT + 'i', 0, 0, FL_MENU_TOGGLE}, +                               {"box", FL_ALT + 'i', 0, 0, FL_MENU_TOGGLE}, 
-                          {0}};+                               {0}};
  
-  auto flex = new Fl_Flex{0, 0, window->w(), 30, Fl_Flex::HORIZONTAL}; +  // ドロップダウンタイプのボタン 
-  auto menu_button = new Fl_Menu_Button{0000, "&Menu Button"}; +  auto menu_button = new Fl_Menu_Button{101015030, "&Menu Button"}; 
-  menu_button->menu(popup); +  menu_button->menu(menu_table);
-  flex->fixed(menu_button, 150); +
-  flex->end();+
  
-  auto group = new Fl_Group{0, flex->h(), window->w(), window->h() - flex->h()}+  // 右クリックで表示されるポップアップメニュー 
-  group->end();+  // ボタンの位置とサイズがクリックの有効範囲となる 
 +  auto menu_popup = new Fl_Menu_Button{0, 0, window->w(), window->h(), "&Popup"}; 
 +  menu_popup->menu(menu_table); 
 +  menu_popup->type(Fl_Menu_Button::POPUP3);
  
-  window->resizable(group); 
   window->end();   window->end();
   window->show(argc, argv);   window->show(argc, argv);
文書の先頭へ