我想在面板底部添加变化数量的二维方块,其小部件位于盒子大小调整器内。
我制作了一个 Square 类小部件,它接受位置、大小和颜色,并制作了它的 3 个实例,并将其添加到盒子大小调整器中。
问题是,它们是从左上角放置的,而不是我想要的左下角放置的。
方形.h
#pragma once
#include <wx/wx.h>
class Square : public wxWindow
{
wxPoint position;
wxSize size;
wxBrush brushColor;
public:
Square(wxPanel* parent, wxPoint rectPosition, wxSize rectSize, wxColour rectColor);
void PaintEvent(wxPaintEvent& evt);
void Draw(wxDC& dc);
DECLARE_EVENT_TABLE()
};
方形.cpp
#include "Square.h"
BEGIN_EVENT_TABLE(Square, wxPanel)
EVT_PAINT(Square::PaintEvent)
END_EVENT_TABLE()
Square::Square(wxPanel* parent, wxPoint position, wxSize size, wxColour color) : wxWindow(parent, wxID_ANY)
{
this->position = position;
this->size = size;
this->brushColor = wxBrush(color);
}
void Square::PaintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
Draw(dc);
}
void Square::Draw(wxDC& dc)
{
dc.SetBrush(brushColor);
dc.DrawRectangle(position.x, position.y, size.x, size.y);
}
主窗口.cpp
#include "MainWindow.h"
#include "Square.h"
MainWindow::MainWindow(const wxString& title) : wxFrame(nullptr, wxID_ANY, title)
{
wxBoxSizer* mainSizer = new wxBoxSizer(wxHORIZONTAL);
wxPanel* sidePanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize);
wxPanel* largePanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize);
mainSizer->Add(sidePanel, 1, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 5);
mainSizer->Add(largePanel, 7, wxEXPAND | wxALL, 5);
this->SetSizerAndFit(mainSizer);
wxBoxSizer* squareSizer = new wxBoxSizer(wxHORIZONTAL);
Square* red_square = new Square(largePanel, wxDefaultPosition, wxSize(20, 20), wxColour(255, 0, 0));
Square* green_square = new Square(largePanel, wxDefaultPosition, wxSize(20, 20), wxColour(0, 255, 0));
Square* blue_square = new Square(largePanel, wxDefaultPosition, wxSize(20, 20), wxColour(0, 0, 255));
squareSizer->Add(red_square, 1, wxEXPAND);
squareSizer->Add(green_square, 1, wxEXPAND);
squareSizer->Add(blue_square, 1, wxEXPAND);
largePanel->SetSizerAndFit(squareSizer);
}
使用 sizer 时,要将窗口(或控件)与其父级的底部对齐,您必须告诉正确的 sizer(计算该父级布局的那个)。
squareSizer->Add(red_square, 1, wxEXPAND | wxALIGN_BOTTOM);
但是将
wxEXPAND
与 wxHORIZONTAL sizer 一起使用意味着窗口将占用所有 vertical 可用空间。所以,align-botton不会有任何效果。
也许您希望矩形(底部)与其父面板顶部边框之间有一些垂直空间。
如果你想固定这个空间,你可以使用边框
squareSizer->Add(red_square, 1, wxEXPAND | wxALIGN_BOTTOM, 25); //25 pixels tall
如果您希望此空间可扩展,请在添加窗口之前使用 AddStretchSpacer:
squareSizer->AddStretchSpacer(1);
如果您想将 70% 分配给间隔物,将 30% 分配给底部窗口,请使用两个比例值:
squareSizer->AddStretchSpacer(70);
squareSizer->Add(red_square, 30, wxEXPAND | wxALIGN_BOTTOM | wxTOP, 25; //25 pixels tall
所有这些都可以在文档中找到:
https://docs.wxwidgets.org/trunk/overview_sizer.html
https://docs.wxwidgets.org/trunk/classwx_box_sizer.html
最后,考虑使用 wxSizerFlags 而不是 Add() 成员中那么多小的清晰参数。