--- nono/wx/wxsubwindow.h 2026/04/29 17:05:00 1.1.1.8 +++ nono/wx/wxsubwindow.h 2026/04/29 17:05:48 1.1.1.12 @@ -4,13 +4,16 @@ // Licensed under nono-license.txt // +// +// サブウィンドウ +// + #pragma once #include "wxnono.h" -class WXPaddingPanel; +class WXTextScreen; -// // サブウィンドウ // // メインウィンドウのメニューから表示されて、表示されてる間チェック状態を @@ -30,74 +33,38 @@ class WXSubWindow : public wxFrame int style); WXSubWindow(wxWindow *parent, wxWindowID id, const wxString& name) : WXSubWindow(parent, id, name, DEFAULT_STYLE) { } - virtual ~WXSubWindow() override; - - // テキスト系パネルのフォントサイズ変更 - virtual void SetFontSize(FontId fontid); - - private: - void OnClose(wxCloseEvent& event); + ~WXSubWindow() override; - wxDECLARE_EVENT_TABLE(); -}; + // フォントサイズ変更 + virtual void FontChanged(); - -// -// 縦リサイズ可能なサブウィンドウ -// -class WXVResizeSubWindow : public WXSubWindow -{ - using inherited = WXSubWindow; - public: - WXVResizeSubWindow(wxWindow *parent, wxWindowID id, const wxString& name); - virtual ~WXVResizeSubWindow() override; - - // テキスト系パネルのフォントサイズ変更 - void SetFontSize(FontId fontid) override; - - // ウィンドウサイズ再計算 (継承先による) - virtual void DoSize() = 0; + void Fit() override; + bool Layout() override; protected: - // ウィンドウサイズを再計算の共通部分 (継承先 DoSize() から呼ばれる) - void CalcVSize(int fixed); + // 自前レイアウト方式を使うことを宣言する。 + void SetMyLayout(); - // テキストパネル - WXTextScreen *screen {}; + // 自前レイアウト方式のサイズに関する情報を取得する。 + virtual bool GetMySizeHints(wxSize *newsz, wxSize *minsz, wxSize *maxsz, + wxSize *incsz); + + // 自前レイアウト。 + // false を返したら子コントロールを配置してよい。 + bool MyLayout(); - // 上下パディング - WXPaddingPanel *padding1 {}; - WXPaddingPanel *padding2 {}; -}; + // Sizer のためにオリジナルのほうのレイアウトを呼ぶ場合に使う。 + bool BaseLayout() { return inherited::Layout(); } -// -// パディングパネル -// -// モニタウィンドウ系で使うテキストパネルは単純なキャラクタビットマップ構造 -// のため、クライアント領域の端の1ピクセルまでふんだんに使用している。 -// モニタウィンドウは本来このテキストパネルを一つ持つだけの単純なウィンドウ -// でよいはずだった。しかし、ウィンドウマネージャ側でこのウィンドウに余白なり -// 枠なりをつけてくれる場合はそれで問題ないが、余白(ふち)を一切つけないタイプ -// のウィンドウマネージャでこのウィンドウを表示するとウィンドウ境界に接する -// 文字の視認性が(文字とウィンドウ外の背景によっては)すこぶる悪い。 -// そのため、こちらで余白パネルを用意する。なお wxSizer にも似たような -// パディング機能はあるが、このパディング領域の背景色はテキストパネルの背景色 -// と異なっているため悪目立ちしてしまう。そのため、テキストパネルと背景色を -// 揃えたパネルをわざわざ用意する。 -// サブウィンドウ系の人は、このパネルを四辺に貼り付けること。 -class WXPaddingPanel : public wxPanel -{ - using inherited = wxPanel; + private: + void OnClose(wxCloseEvent& event); - // デフォルトの余白幅もしくは高さ [px] - // 余白は、リサイズ可能なテキストウィンドウのリサイズ方向では1行の高さや - // 1文字の幅の整数倍にしなければならない(したい)ので都度計算する必要が - // あるが、そうでない固定方向については現在のフォントから計算とかも面倒 - // なのでとりあえず固定値としておく。単位は px。 - static const int DefaultPadding = 3; + wxSize DoMySizeHints(); - public: - WXPaddingPanel(wxWindow *parent); - WXPaddingPanel(wxWindow *parent_, const wxSize& size_); - virtual ~WXPaddingPanel(); + // 自前レイアウト方式用。 + bool my_layout {}; // 自前方式を使う場合は true + bool my_layout_pass2 {}; // 1パス目/2パス目の区別用。 + wxSize prev_border {}; // 前回のウィンドウマネージャ装飾サイズ + + wxDECLARE_EVENT_TABLE(); };