FLTKを使うと、設置したコントロール類がウィンドウサイズの変更と同時に移動・リサイズしてしまう。生成時の比率を維持するらしく使い勝手が悪いが、デフォルトでその機能を無効にする手段が見当たらなかったので、Event::Resize時にコントロールサイズを強制的に書き換えることで対処する。
use fltk::{app, prelude::*, window::Window, button::Button, enums::Event};
// 最初に指定したサイズ情報をボタンと一緒に扱うための構造体 struct WidgetWrap<T>{ x:i32, y:i32, w:i32, h:i32, btn:T, }
// WidgetWrapにボタンにメソッドを追加 impl<T:WidgetExt> WidgetWrap<T>{ /// @brief ウィジェットのサイズを含めてボタン管理 /// @param x_ x座標 /// @param y_ y座標 /// @param w_ 幅 /// @param h_ 高さ /// @param widget ウィジェットオブジェクト /// @return WidgetWrap<T> ウィジェット管理オブジェクト fn new(x_:i32,y_:i32,w_:i32,h_:i32,widget:T)->Self{ let mut _widget:WidgetWrap<T> = WidgetWrap{ x: x_, y: y_, w: w_, h: h_, btn:widget }; return _widget; } /// @brief ウィンドウサイズが変更されるときに呼び出し、ボタンの位置とサイズを強制的に維持する fn size_keep(&mut self){ self.btn.resize(self.x, self.y, self.w, self.h); } }
fn main() { let app = app::App::default(); let mut wind = Window::new(100, 100, 400, 300, "Resizable Window"); let mut _btn = Button::new( 160, 200, 80, 40, "The Button");// ボタン生成 let mut _btnwrap= WidgetWrap::new(// ボタンをサイズと一緒に管理する構造体に管理委譲 160, 200, 80, 40, _btn ); wind.end(); wind.resizable(&wind); wind.show(); wind.handle(move |_, ev| match ev { // ここでリサイズイベント時の処理を行う Event::Resize => { // ボタンの位置とサイズを保持 _btnwrap.size_keep(); true } _ => false, } ); app.run().unwrap(); }