如何用wxFlexGridSizer适配多行wxGrid且不隐藏下方按钮?
解决方案:用wxFlexGridSizer实现等同wxBoxSizer的布局效果
当然可以用wxFlexGridSizer实现和你给出的wxBoxSizer方案完全一致的效果,你的现有代码有两个关键疏漏,调整后就能让按钮正常显示,同时Grid保持滚动功能:
修正后的代码
wxGrid *grid = new wxGrid(this, wxID_ANY); grid->CreateGrid(0, 2); grid->SetDefaultRowSize(20); grid->AppendRows(200); wxButton *button = new wxButton(this, wxID_ANY, "button"); // 明确指定1行2列的FlexGridSizer(比依赖自动列数更清晰) wxFlexGridSizer *fgsMain = new wxFlexGridSizer(1, 2, 0, 0); // 给Grid添加wxEXPAND标志,让它被sizer约束高度,自动显示滚动条 fgsMain->Add(grid, 1, wxALL | wxEXPAND, 5); // 按钮添加垂直居中对齐,和BoxSizer默认效果一致 fgsMain->Add(button, 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); fgsMain->AddGrowableRow(0); fgsMain->AddGrowableCol(0); SetSizer(fgsMain);
问题原因分析
你的原代码之所以按钮消失,核心问题是:
- 缺少
wxEXPAND标志:Grid的自然高度是200行×20px=4000px,远超过窗口高度。没有wxEXPAND时,wxFlexGridSizer会完全遵循Grid的自然高度,导致整个布局高度被撑到4000px,按钮被推到窗口可视区域之外。加上wxEXPAND后,Grid会被约束到sizer分配的窗口高度内,自动触发滚动条显示。 - 未设置按钮垂直对齐:虽然不影响显示,但
wxBoxSizer水平布局时默认会让控件垂直居中,加上wxALIGN_CENTER_VERTICAL可以让FlexGridSizer的效果和BoxSizer完全一致。
你之前尝试的AddGrowableRow和比例参数是正确的方向,但因为缺少wxEXPAND,Grid没有被正确约束,所以问题没解决。
内容的提问来源于stack exchange,提问作者lumapu




