移除 wxWidgets 控件

6

我发现在搜索中很难找到这个问题的答案,但很简单,如何从面板中删除控件?我有一些wxStaticText和wxTextCtrl,我想要删除现有的控件并用新的替换它们。是否有某种命令可以调用,或者我必须自己创建一个?谢谢。

2个回答

6

编辑: 如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(例如背景颜色,边框等)。


1
仅仅调用指针的delete操作是很危险的。这样做可能会导致消息被发送到已删除的窗口。更好的方法是调用Destroy()函数。 - ravenspoint
@ravenspoint 您是正确的。一些控件在 Destroy() 中执行额外的清理工作,而析构函数没有完成这些工作。 - Anonymous Coward

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接