【问题标题】:How to resize frame after hiding a component in wxwidgets如何在 wxwidgets 中隐藏组件后调整框架大小
【发布时间】:2018-04-19 18:11:50
【问题描述】:

我有一个框架,它有 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() 来适当地布置您的控件。您在此处发布时是否忽略了它?

标签: c++ user-interface wxwidgets


【解决方案1】:

每当我需要动态更新控件的大小时,我总是调用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();
}

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

【讨论】:

  • “每当我需要动态更新控件的大小时,我总是调用 Layout() 和 Refresh()”——这只是cargo culting 还是你真的有原因/解释你为什么这样做?
  • 这意味着通常有不止一种方法可以完成给定任务,这就是我选择的方式。
  • @JesperJuhl,有一个原因/解释。在最顶部的窗口上调用 Layout() 会导致递归地重新计算该窗口上所有控件的位置/大小。而且我认为没有其他方法可以做到这一点。可能不需要 Refresh() 调用,但我不确定。
猜你喜欢
  • 2010-12-27
  • 2014-05-22
  • 2014-03-17
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多