0

我正在使用 sizer 将按钮放置在网格中:

在此处输入图像描述

但是,我不希望 sizer 使用窗口中的所有空间,而只是使用一个小区域,如下所示(在白色区域中):

在此处输入图像描述

这有可能实现吗?如果是,如何? 请知道我对 wxWidgets 很陌生。

顺便说一下,这是框架背后的代码:

Main::Main() : wxFrame(nullptr, wxID_ANY, "IKE Calculator", wxDefaultPosition, wxSize(500, 650), wxDEFAULT_FRAME_STYLE & ~wxMAXIMIZE_BOX & ~wxRESIZE_BORDER)
{
    int w = 3, h = 3;

    NumBtn = new wxButton*[w*h];
    NumSizer = new wxGridSizer(w, h, 0, 0);

    //Populate sizer
    int cycle = 1;
    for (int x = 0; x < w; x++)
    {
        for (int y = 0; y < h; y++)
        {
            int current = (y * w + x);
            NumBtn[current] = new wxButton(this, BUTTON_NUM + current, std::to_string(cycle));
            NumSizer->Add(NumBtn[current], 1, wxEXPAND | wxALL);

            cycle++;
        }
    }

    this->SetSizer(NumSizer);
    NumSizer->Layout();
}

Main::~Main()
{
    delete[] NumBtn;
}
4

1 回答 1

1

Sizer 用于定位窗口的子窗口,它们为此使用整个窗口客户区(即其中的所有内容)。这并不意味着你不能以你想要的方式定位你的按钮,当然,它只是意味着你必须以正确的方式来做:

  1. 您可以创建一个仅占用您希望它占据的区域的子窗口,然后将按钮创建为其子窗口并将大小调整器与此窗口相关联。当然,这假设您可以正确定位此窗口,但窗口有SetSize()方法,因此原则上可以这样做。但是手动设置 sizers 并不是正确的做法,并且您可能会遇到定位窗口唯一子项的常见问题,因此最好以另一种方式进行。
  2. 这种另一种方式是使用“spacers”,它们是占用“空间”的sizer元素,而不做任何其他事情,以占据窗口的未使用部分。例如,在这种情况下,您可以创建一个wxBoxSizer(wxVERTICAL)包含给定高度(顶部区域)的间隔的垂直 box sizer ( ) 和一个包含对应于左侧间隙和当前 sizer 的间隔的水平 box sizer。

请注意,您想要创建的布局是相当不寻常的,通常您不需要将窗口的任意大小部分留空。所以你不会经常做这样的事情,但如果你真的想做,当然可以。

于 2021-03-15T15:56:45.660 回答