gtkmmでwindow位置を可変にする方法
今回はgtkmmでwindowの位置を変更する方法についてまとめていきたいと思います!!
位置を指定してwindowをいくつか座標を指定して配置したい時などに使用できるかな?と思います。
■条件
今回gtkmmでwindowの位置を指定するにあたり、windowのレイアウトはgladeというデザイナーを用います。
gladeの導入方法やgtkmmとの連携方法についてはこちらにまとめております。
elsammit-beginnerblg.hatenablog.com
■windowを準備
gladeによるデザインですが、こちらの通りImage Widgetが1つおいてあるだけのシンプルなwindowにします。
またwidget ID名ですが、
・widdow:TestWindow
・Image:_Image
としました。
またヘッダファイルとして下記を定義しました。
class MainWin : public Gtk::Window { Gtk::Window TestWindow; Gtk::Image* _Image; Glib::RefPtr<Gtk::Builder> builder; public: MainWin(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade); };
■windowの位置を指定する
では本題の位置指定をしていきます。
位置指定ですが、
MainWin::MainWin(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) : Gtk::Window(cobject), builder(refGlade) { gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y); ・・・
というように、gtk_window_moveを用いればOKです。
下記の通り、x軸(input_x)、y軸(input_y)を指定することでwindowの座標位置を指定することが可能です。
この座標ですが、windowの左上端の位置に該当します。
gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y);
全体のコードはこちらのように記載しました。
MainWin::MainWin(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) : Gtk::Window(cobject), builder(refGlade) { gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y); this->builder->get_widget("_Image", this->_Image); this->_Image->set("画像ファイル名"); }
こちらのinput_x、input_yを指定する際に、ファイルなどの外部ファイルからセットするようにすればwindowを動的(可変)にセットすることが出来ます。
例えば、
void FileRead(){ std::ifstream ifs(fileName); std::string str; if (!ifs){ std::cout << "ファイルが開けませんでした。" << std::endl; return; } int i = 0; while(getline(ifs, str)){ if(i == 0){ input_x = std::stoi(str); i++; }else if(i == 1){ input_y = std::stoi(str); i++; } } }
というようにテキストファイルを読み出し、input_x、input_yにx座標、y座標を指定するようにします。
こうすることにより、細かい座標位置を外部ファイルで調整できるようになるので調整しやすくなります。
■(おまけ)座標の動的指定について
windowの位置を指定する、
gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y);
ですが、windowを生成した後でも位置変更が可能です。
このため、ボタンwidgetを設置してボタンクリックするとwindowの位置が移動するコードの作成も可能になります。