如何在wxWidgets中实现WinForms的DockStyle控件停靠效果
问题原因与修复方案
现有代码错误点
SetMaxSize(wxSize(0, 30))将控件宽度强制限制为0,直接导致面板不可见,要固定高度不限制宽度,宽度参数应传-1表示自适应- 向垂直BoxSizer添加两个控件时,
proportion参数都设为1,会导致两个面板平分窗口垂直空间,不符合聊天区占满剩余空间、输入框固定高度的需求
修复后的代码
namespace tms { MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { this->InitialiseComponents(); } void MainFrame::InitialiseComponents() { this->panelChatLog = new wxPanel(this, wxID_ANY); this->panelChatLog->SetBackgroundColour(wxColour(0, 255, 0)); this->panelChatInput = new wxPanel(this, wxID_ANY); this->panelChatInput->SetBackgroundColour(wxColour(0, 0, 255)); // 固定高度30px,宽度不限制 this->panelChatInput->SetMinSize(wxSize(-1, 30)); this->panelChatInput->SetMaxSize(wxSize(-1, 30)); this->sizerPanels = new wxBoxSizer(wxVERTICAL); // 聊天区proportion设为1,占满所有剩余空间 this->sizerPanels->Add(this->panelChatLog, 1, wxEXPAND | wxALL); // 输入框proportion设为0,不参与剩余空间分配,保持固定高度 this->sizerPanels->Add(this->panelChatInput, 0, wxEXPAND | wxALL); this->SetSizer(this->sizerPanels); // 首次渲染主动触发布局计算,避免初始化尺寸异常 this->Layout(); } void MainFrame::OnExit(wxCommandEvent& event) { this->Close(true); } }
WinForms Dock效果对应wxWidgets实现方式
wxWidgets通过Sizer体系实现响应式停靠,对应关系如下:
DockStyle.Fill:将控件添加到父容器的Sizer时,proportion参数设为1,同时添加wxEXPAND标记,控件会占满父容器剩余所有空间DockStyle.Top/DockStyle.Bottom:使用垂直方向wxBoxSizer,添加控件时proportion设为0,添加wxEXPAND标记,控件会保持自身高度、宽度铺满父容器,按添加顺序排列在顶部/底部DockStyle.Left/DockStyle.Right:使用水平方向wxBoxSizer,添加控件时proportion设为0,添加wxEXPAND标记,控件会保持自身宽度、高度铺满父容器,按添加顺序排列在左侧/右侧- 复杂停靠布局可以通过嵌套不同方向的Sizer实现
内容的提问来源于stack exchange,提问作者Kaskorian
相关产品推荐
相关产品推荐

