用wxSizer 到几个类 怎么 可以做到 让父panl 跟随子UI改变而改变大小

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
lfjking
Earned some good credits
Earned some good credits
Posts: 102
Joined: Mon Nov 14, 2016 1:35 pm

用wxSizer 到几个类 怎么 可以做到 让父panl 跟随子UI改变而改变大小

Post by lfjking »

我最近遇到个问题。虽然暴力解决了。但是 还是想发出来问下 可否用wx 到方式得到答案
就是 按比例 约束窗口size 到问题
一个主窗口MainFrame 调用了 wxAUI
创建一个 panl 添加到 wxAUI, panl 作为一个浮动窗口。
panl 增加一个 wxSizer 來管理 子控件 child_panl(这个用来放在panl 顶部 用来放 一排按钮的) 和 wxStaicBitmap.
panl 有一个 size_chang 事件:当窗口大小变化时用来 按照 wxStaicBitmap包含到图片的大小比例來 缩放wxStaicBitmap 并约束 panl 的Size

大概像这样子:

Code: Select all

class MainFrame : public wxFrame
{
   protected:
      wxPanel* m_Aui_float_panel;
      wxPanel* m_Aui_float_panel_child_top_panel;
      wxStaticBitmap* m_Aui_float_panel_child_center_bitmap;
   
   public:
      
      MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
      wxAuiManager m_mgr;
      
      ~MainFrame();
   
};

MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
   this->SetSizeHints( wxDefaultSize, wxDefaultSize );
   m_mgr.SetManagedWindow(this);
   m_mgr.SetFlags(wxAUI_MGR_DEFAULT);
   
   m_Aui_float_panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
   m_mgr.AddPane( m_Aui_float_panel, wxAuiPaneInfo() .Left() .PinButton( true ).Float().FloatingPosition( wxPoint( 532,273 ) ).Resizable().FloatingSize( wxSize( 110,221 ) ) );
   
   wxFlexGridSizer* fgSizer1;
   fgSizer1 = new wxFlexGridSizer( 0, 1, 0, 0 );
   fgSizer1->SetFlexibleDirection( wxBOTH );
   fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
   
   m_Aui_float_panel_child_top_panel = new wxPanel( m_Aui_float_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
   fgSizer1->Add( m_Aui_float_panel_child_top_panel, 1, wxEXPAND | wxALL, 5 );
   
   m_Aui_float_panel_child_center_bitmap = new wxStaticBitmap( m_Aui_float_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
   m_Aui_float_panel_child_center_bitmap->SetMinSize( wxSize( 100,200 ) );
   
   fgSizer1->Add( m_Aui_float_panel_child_center_bitmap, 0, wxALL, 5 );
   
   
   m_Aui_float_panel->SetSizer( fgSizer1 );
   m_Aui_float_panel->Layout();
   fgSizer1->Fit( m_Aui_float_panel );
   
   m_mgr.Update();
   this->Centre( wxBOTH );
}

void MainFrame::Onm_Aui_float_panel_Changed_Size( wxSizeEvent& event ) {

   //Calculate the aspect ratio of the picture here, let m_Aui_float_panel_child_center_bitmap show with The proportion of the image
   //wxSize picsize  is the  pic size
   
         wxSize dvsize(event.GetSize());
         int ddw = dvsize.GetWidth(),
            ddh = dvsize.GetHeight(),
            dsw = 0, dsh = 0;
         double _sim = picsize.GetWidth()*1.0 / picsize.GetHeight();
         dsw = ddw;
         dsh = dsw / _sim;
         m_Aui_float_panel_child_center_bitmap->SetClientSize(wxSize(x, y));
         
}
现在是当panl窗口大小大小变化后。计算后wxStaicBitmap 大小能调整。但是 这个 panl 大小 没办法约束到 刚好可以完全显示所有子控件的size。
不知道大家听明白不?
比方说我想做个图片浏览器, 顶部是一排功能按钮。显示不同规格大小到图片时 这个panl 都能根据wxStaicBitmap的大小调整到刚好把整个图片都显示出来。
我现在就是 大体估算 wxStaicBitmap 大小 和 panl 大小差 硬生生到添加一个宽高差值 然后 FloatingSize 来调整的。

我就想要是界面控件再多点。分布再散点的情况 拿就很麻烦。
不知道 在wx框架里面有没有一些 可以 帮助这种父随子变的算法函数。
Post Reply