スポンサーリンク

RustでFLTKを使用してGUIを表示(2)コントロールのサイズと位置を固定

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();
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: