如何在 wxwidgets 中隐藏组件后调整框架大小

How to resize frame after hiding a component in wxwidgets

本文关键字:调整 框架 组件 隐藏 wxwidgets      更新时间:2023-10-16

我有一个框架,它有 4 个文本框和一个链接(更改文本框的数量(。 当用户单击链接时,我隐藏了第 4 个文本框。 但是发生的情况是在隐藏第 4 个文本框后,它的空间仍然是空白的。我不想将其空间留空。该空间应该消失,框架应该调整大小。有什么方法可以做到这一点吗?当用户再次单击链接时(更改文本框的数量,我再次显示第 4 个文本框。

法典:

m_ComputerNameText1 = new wxTextCtrl(m_panel, wxID_ANY, "computerName", wxDefaultPosition, wxSize(250, wxDefaultSize.GetHeight()));
m_ComputerNameText2 = new wxTextCtrl(m_panel, wxID_ANY, "computerName1", wxDefaultPosition, wxSize(250, wxDefaultSize.GetHeight()));
m_ComputerNameText3 = new wxTextCtrl(m_panel, wxID_ANY, "computerName3", wxDefaultPosition, wxSize(250, wxDefaultSize.GetHeight()));
m_ComputerNameText4 = new wxTextCtrl(m_panel, wxID_ANY, "computerName4", wxDefaultPosition, wxSize(250, wxDefaultSize.GetHeight()));
m_hyperLinkOption = new wxHyperlinkCtrl(m_panel, wxID_ANY, "Change no of textboxes", wxT(""), wxDefaultPosition, wxSize(135, wxDefaultSize.GetHeight()));
m_userPassSizer->Add(m_ComputerNameText1, 0, wxALIGN_LEFT | wxALL, 0);
m_userPassSizer->Add(m_ComputerNameText2, 0, wxALIGN_LEFT | wxALL, 0);
m_userPassSizer->Add(m_ComputerNameText3, 0, wxALIGN_LEFT | wxALL, 0);
m_userPassSizer->Add(m_ComputerNameText4, 0, wxALIGN_LEFT | wxALL, 0);
m_userPassSizer->Add(m_hyperLinkOption , 0, wxALIGN_LEFT | wxALL, 0);

单击超链接时执行以下函数。

void OnAuthCodeOptionLinkClicked(wxHyperlinkEvent& event)
{
    if (!m_hyperlinkOptionSelected)
    {
    m_hyperlinkOptionSelected= true;
    m_ComputerNameText4->Hide();
    m_hyperLinkOption->SetLabel("Go back");
}
else
{
    m_hyperlinkOptionSelected= false;
    m_ComputerNameText4->Show();
    m_hyperLinkOption->SetLabel("change no of textboxes");
}

}

这样,我必须隐藏并显示第 4 个文本框。隐藏后会留下一些空白。我怎样才能利用该空白区域并获取链接来代替第 4 个文本框?

每当我需要动态更新控件的大小时,我总是调用Layout()Refresh()

您可以在此处找到有关布局的更多信息:http://docs.wxwidgets.org/3.1/classwx_window.html#a1b143c3e72bd0af533b76db4830a6113以及有关窗口大小的一些好信息:http://docs.wxwidgets.org/3.1/overview_windowsizing.html

调用布局假定构造和管理文本框等的类本身是 wxWindow 派生控件(如面板、框架等(。 如果没有,就像您在视图模型上进行更改一样,您需要在拥有的窗口上调用布局和刷新:

void UpdateView()
{
    view->Layout();
    view->Refresh();
}

您可能需要使用尺寸调整器、窗口的最小大小等来获得您想要的确切行为。