关于wxDialog 需要了解的重要一点(如果您还没有)是在堆栈上创建它们是完全可以的(大多数 wxWidgets 窗口应该在堆上创建)。
这意味着您的对话框实例即使在用户按“确定”关闭后仍然可用。您可以通过以下代码测试用户响应:
... existing method ...
AddUser dialog (this);
if (dialog.ShowModal() == wxID_OK)
{
... process new user ...
}
由于对话框仍在实例化,您可以在对话框代码中包含一个返回新用户的方法,如下所示:
User AddUser::GetUser ()
{
return newUser;
}
但是,您当然应该小心实际创建新用户的位置。例如,如果新用户对象是在对话框中本地创建的,那么您将需要制作它的副本(如上例所示)。如果它是在堆上创建的(我不建议这样做),那么您可以返回一个指针。第三种选择是传递对GetUser 方法的引用,这样对话框方法如下所示:
bool AddUser::GetUser (User& user)
{
// Make sure that all fields are valid. Simple example given, but
// should be more complete.
if (TextName->GetValue() != "" && TextSurname->GetValue() != "")
{
user.setName(TextName->GetValue());
user.setSurname(TextSurname->GetValue());
return true;
}
return false;
return newUser;
}
调用看起来像这样:
void wxBiblioFrame::OnButAddUserClick(wxCommandEvent& event)
{
AddUser dialog(this);
myUserDialog dialog (this);
myUserClass newUser;
if (dialog.ShowModal() == wxID_OK)
{
if (dialog.GetUser (newUser))
{
... process and store the new user ...
}
else
{
... handle the error ...
}
}
// NOTE: no need to Destroy() the dialog.
}
顺便说一句,除非您的用户类很大,否则从效率的角度来看,我不会太担心制作对象的副本。创建和关闭对话框可能会使制作副本所花费的时间相形见绌。