【问题标题】:WinForms control docking in wxWidgetswxWidgets中的WinForms控件对接
【发布时间】:2021-05-24 13:41:07
【问题描述】:

我是 wxWidgets 的新手,因为我在使用 C++ 编程时从不使用 GUI。现在我必须这样做。我想使用 WinForms 中的 DockStyle.Right/Bottom/Fill 之类的东西使 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);
    }
}

【问题讨论】:

  • wxWidgets 具有 wxAUI 系列控件。您可以在this video 中查看演示。这就是你要找的吗?
  • @NewPagodi 不太高级。不是那种对接方式。只要有一个父母,你就可以对接一个孩子,例如右侧的面板,因此它放置在右侧始终与父级的高度匹配,但保持其宽度。另一个设置为 dock.fill 的孩子将填充剩余的空间。我用谷歌搜索了一下,我认为它可以使用水平 wxBoxSizer 来完成,但我无法让它工作......
  • 我现在明白了。我认为您是正确的-您要做的是在 wxWidgets 中使用 sizer 完成。一开始,Sizer 学习起来有点棘手。您可能会发现 wxFormbuilder 或 wxCrafter 等工具有助于入门。它们可以帮助您实时查看所有大小调整选项的作用。
  • @Matze,或者您可以安装与任何“wx”IDE 无关的 wxGlade。

标签: c++ wxwidgets


【解决方案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 等可视化工具有助于了解所有这些数字和属性如何转化为应用程序表单中窗口的实际布局。我知道他们真的帮助了我。

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 2012-12-16
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多