【问题标题】:How to limit a sizer within a certain space? (wxWidgets)如何将sizer限制在某个空间内? (wxWidgets)
【发布时间】:2021-03-15 11:54:00
【问题描述】:

我正在使用 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;
}

【问题讨论】:

  • 你能贴出你的代码吗?特别是 - 您是否有任何其他控件,以及如何将按钮添加到 sizer?
  • 好的,我会编辑这篇文章
  • 2 解决方案:您可以尝试为框架指定初始大小,也可以覆盖DoGetBestSize() 并返回按钮的最小大小。但一般来说 - 你为什么需要它?即使你实现了你想要的,当用户调整框架控件的大小时,它也会随之调整大小。这就是sizer的全部想法。您也可以尝试仅使用wxEXPAND 或仅使用0 作为最后一个参数。

标签: c++ wxwidgets sizer


【解决方案1】:

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

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

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

【讨论】:

  • 在创建这篇文章之前,我尝试在框架内创建一个 wxPanel,然后将 wxGridSizer 设置为面板。面板创建成功,但是按钮没有。
  • 事实上,我正在尝试创建一个计算器,类似于 Windows 默认的计算器。与每个数字计算器一样,有 9 个大按钮,数字从 1 到 9,排列在一个网格中,旁边还有其他较小的按钮,可以进行乘法、除法等操作。您看到的是我尝试创建 9 个按钮,这是我应该用来实现目标的方法,还是您建议尝试其他方法,例如手动放置按钮?
  • 对于计算器,您只需要按钮周围的边框,可以轻松添加到任何尺寸大小的项目中,因此您可能根本不需要任何垫片。只需在矩形框中从上到下分解您想要的布局,然后为每个框创建大小调整器。
  • 矩形框是什么意思?窗户,面板?另外,我应该使用哪种类型的sizer(wxGridSizer、wxFlexGridSizer、wxBoxSizer 等)?
  • “矩形框” == wxBoxSizer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2021-08-06
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多