[C++] 172 FLTK : 別ウィンドウへの画面遷移 

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

開発中のビデオツールアプリで別ウィンドウへ画面遷移できるようにしました。

これができなければFLTKを使いこなせているとは言えない、と思いながらついつい放置してきましたが、ようやく本腰を入れて取り組みました。

初めは同一Fl_Windowでredrawさせようかとも考えたものの、コンストラクタ内で条件分岐するとウィンドウが真っ黒になり挫折、別WindowとしてSubWindowクラスを作成したらうまくできました。表示する位置が元ウィンドウと完全一致するように工夫を入れています。

着手2時間で挫折、昼寝中に解決方法を着想、起きて30分で実装という流れでした。職場なら2、3時間の昼寝はご法度でしょうが、プログラミングの場合は比較的長時間の馬上(ドライブ・乗り物他)・枕上(昼寝)・厠上(トイレ)の三上を認めてもらいたいものです。あと電話が鳴る環境も思考深化の妨げになるので厳禁です。

ゲームや動画鑑賞など、頭をリラックスさせて着想に導く方法は人それぞれなので、何でも取り入れてみるべきですね。着手して1回泥沼にハマる(周辺知識を一気に詰め込む作業でもある)ことが前提条件です。

Fl_Window *window;
SubWindow *subWindow;
int mode; // 0:メイン、1:サブ

void switchWindow(Fl_Widget*, void*){
    if (mode == 1){
        mode = 0;
        subWindow -> hide();

        int xs_win = subWindow->x_root();
        int ys_win = subWindow->y_root();
        cout<<"xs_win "<< xs_win <<" ys_win "<< ys_win <<endl;
        
        window->resize(xs_win,ys_win,720,480);
        window -> show();

    } else {
        mode = 1;
        window -> hide();

        int x_win = window->x_root();
        int y_win = window->y_root();
        cout<<"x_win "<< x_win <<" y_win "<< y_win <<endl;
        
        subWindow->resize(x_win,y_win,720,480);
        subWindow -> show();

    }
}

int main(int argc, char **argv) {
    static Fl_Menu_Item	items[] = {
    { "設定", 0, 0, 0, FL_SUBMENU },
    { "ウィンドウ切替", 0, switchWindow, 0, 0 },
    { 0 },
    { 0 }
    };
    Fl_Sys_Menu_Bar *menubar;
    menubar = new Fl_Sys_Menu_Bar(0, 0, 60, 20);
    menubar->box(FL_FLAT_BOX);
    menubar->menu(items);

    window = new Fl_Window(100,100,720,480,"Video Tool");
    window->color(fl_rgb_color(0,163,175));

    <中略>

    window->end();
    window->show(argc, argv);

    // SubWindow(最初は表示しない)
    int x_win = window->x_root();
    int y_win = window->y_root();

    subWindow = new SubWindow(720,480,"Video Tool 2nd");
    subWindow->resize(x_win,y_win,720,480);

    return Fl::run();
}
#pragma once
#include <FLstd.h> // 自製ヘッダファイル FLTKライブラリ
#include <cppstd.h> // 自製ヘッダファイル C++標準ライブラリ

class SubWindow: public Fl_Window
{
public:
	SubWindow(int w,int h,const char *title);
	~SubWindow();
};
#include <SubWindow.h>

SubWindow::SubWindow(int w,int h,const char *title=0)
	:Fl_Window(w,h,title){
	this->Fl_Widget::color(fl_rgb_color(65,154,202)); // ふじむらさき
}
SubWindow::~SubWindow(){}