wxWidgets 从左下角而不是左上角添加小部件(在 sizer 中)?

问题描述 投票:0回答:1

我想在面板底部添加变化数量的二维方块,其小部件位于盒子大小调整器内。

我制作了一个 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);
}
c++ position wxwidgets sizer
1个回答
0
投票

使用 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() 成员中那么多小的清晰参数。

© www.soinside.com 2019 - 2024. All rights reserved.