0

我是 wxWidgets 的新手,因为我在用 C++ 编程时从不使用 GUI。现在我必须这样做。我想使用DockStyle.Right/Bottom/FillWinForms 之类的东西使 UI 响应。由于我之前没有尝试过代码,所以问题很短,也不是最好的,但我希望有人能帮助我。

编辑: 这就是我目前拥有的。当我取消注释 SetMaxSize 时,底部有 30px 的空间,但面板(蓝色)不可见:

namespace tms {
    MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) {
        this->InitialiseComponents();
    }
    
    void MainFrame::InitialiseComponents() {
        this->panelChatLog = new wxPanel(this, wxID_ANY);
        this->panelChatLog->SetBackgroundColour(wxColour(0, 255, 0));
        
        this->panelChatInput = new wxPanel(this, wxID_ANY);
        this->panelChatInput->SetBackgroundColour(wxColour(0, 0, 255));
        this->panelChatInput->SetMinSize(wxSize(0, 30));
        //this->panelChatInput->SetMaxSize(wxSize(0, 30));

        this->sizerPanels = new wxBoxSizer(wxVERTICAL);
        this->sizerPanels->Add(this->panelChatLog, 1, wxEXPAND | wxALL);
        this->sizerPanels->Add(this->panelChatInput, 1, wxEXPAND | wxALL);
        this->SetSizer(this->sizerPanels);
    }

    void MainFrame::OnExit(wxCommandEvent& event) {
        this->Close(true);
    }
}
4

1 回答 1

1

一开始学习sizer可能有点棘手。但是一旦你吸收了这个概念,它们就会成为为你的应用程序布置窗口和控件的非常有效的工具。

在上面的特定情况下,当您取消注释 SetMaxSize 行时,您将窗口的最小宽度和最大宽度都设置为 0 - 这意味着窗口的宽度为 0。相反,您可以使用特殊值 - 1 表示未指定最小宽度和最大宽度。因此,sizer 将为窗口选择最佳宽度:

        this->panelChatInput->SetMinSize(wxSize(-1, 30));
        this->panelChatInput->SetMaxSize(wxSize(-1, 30));

或者,您可以在将下部面板添加到 sizer 时使用比例属性。如果将比例设置为 0,则窗口将采用最小尺寸(垂直方向)。由于设置了 wxEXPAND 标志,它仍将沿水平方向扩展。

...
        this->panelChatInput->SetMinSize(wxSize(-1, 30));

        this->sizerPanels = new wxBoxSizer(wxVERTICAL);
        this->sizerPanels->Add(this->panelChatLog, 1, wxEXPAND | wxALL);
        this->sizerPanels->Add(this->panelChatInput, 0, wxEXPAND | wxALL);
...

无论哪种方式,您都会得到如下所示的布局: 在此处输入图像描述

我认为这就是你想要完成的。对不起,如果我误解了。

另外,正如我上面提到的,wxFormbuilder、wxCrafter 和 wxGlade 等可视化工具有助于了解所有这些数字和属性如何转换为应用程序表单中窗口的实际布局。我知道他们真的帮助了我。

于 2021-05-24T15:45:24.993 回答