【问题标题】:Remove controls wxWidgets删除控件 wxWidgets
【发布时间】:2012-12-16 05:46:06
【问题描述】:

我发现这很难从搜索中找到,但很简单,如何从面板中删除控件?我有一些 wxStaticText 和 wxTextCtrl,我想交换删除现有项目并用新项目替换它们?有什么命令我可以调用还是我必须自己做点什么?干杯

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    编辑:正如 ravenspoint 指出的那样,仅仅删除控件是不够的。一些控件在Destroy() 中执行额外的清理。

    您可以简单地Destroy() 控制。 wxWidgets 会自动将其从父窗口中移除并释放其内存。

    wxWindow* ctrl = new wxStaticText(this);
    ctrl->Destroy();
    ctrl = new wxTextCtrl(this);
    

    如果没有指向控件的指针,可以使用FindWindowByIdFindWindowByLabelFindWindowByName获取:

    if(wxWindow* ctrl = wxWindow::FindWindowById(ID_MYCTRL,this))
        ctrl->Destroy();
    

    如果控件被添加到一个sizer,它必须在它仍然有效的时候被替换:

    newCtrl = new wxWindow(...);
    sizer->Replace(oldCtrl,newCtrl); // both oldCtrl and newCtrl must be valid
    oldCtrl->Destroy();
    Layout(); // update sizer
    

    或者,您可以从一开始就创建一个 wxTextCtrl 并将其设为只读。但是,需要进行额外的样式修改以使其看起来像 wxStaticText(例如背景颜色、边框等)。

    【讨论】:

    • 简单地在指针上调用 delete 是很危险的。您最终可能会将消息发送到已删除的窗口。最好调用 Destroy()。
    • @ravenspoint 你是对的。一些控件在 Destroy() 中执行额外的清理,这不是由析构函数完成的。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多