微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 sizer 限制在某个空间内? (wxWidgets)

如何解决如何将 sizer 限制在某个空间内? (wxWidgets)

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

enter image description here

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

enter image description here

这有可能实现吗?如果是,如何? 请注意,我对 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);

    //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 用于定位窗口的子窗口,并且为此使用整个窗口客户区(即其中的所有内容)。这并不意味着你不能按照你想要的方式放置按钮,当然,这只是意味着你必须以正确的方式去做:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。