目录
- wxDialog
- 包含
- 类继承
- 具体描述
- 模态和无模态
- 支持样式
- 此类发出的事件
- wxWindow::Close()
- wxCloseEvent
- 具体描述
- 使用此类的事件
wxDialog
包含
#include <wx/dialog.h>
类继承
描述主
具体描述
对话框是一个带有标题栏的窗口,有时还有一个系统菜单,可以在屏幕上移动。
它可以包含控件和其他窗口,通常用于允许用户做出选择或回答问题。
对于具有低分辨率屏幕的计算机,对话框可以自动滚动。
对话框通常包含一个允许关闭对话框的按钮或两个按钮,一个接受更改,另一个放弃更改(如果存在此按钮,则当用户按下“Esc”键时会自动激活)。默认情况下,具有标准wxID_OK和wxID_CANCEL标识符的按钮的行为符合预期。从wxWidgets 2.7开始,也可以使用具有不同标识符的按钮,请参见SetAffirmativeId()和SetEscapeId()。
还要注意,CreateButtonSizer()应该用于创建适合当前平台的按钮,并正确定位(包括它们的顺序,这取决于平台)。
模态和无模态
有两种对话框,模态和非模态。
模态对话框会阻止其他窗口上的程序流和用户输入,直到它被关闭,而非模态对话框的行为更像是程序流中的一个框架,而其他窗口中的输入仍然是可能的。要显示模式对话框,应该使用ShowModal()方法,而要非模式显示对话框,只需使用show(),就像使用框架一样。
注意,模态对话框是wxWindow派生对象的少数示例之一,这些对象可以在堆栈上创建,而不是在堆上创建。换句话说,虽然大多数窗口都是这样创建的:
void AskUser()
{
MyAskDialog *dlg = new MyAskDialog(...);
if ( dlg->ShowModal() == wxID_OK )
// ...
//else: dialog was cancelled or some another button pressed
dlg->Destroy();
}
通过使用更简单的代码,您可以使用对话框获得相同的结果:
void AskUser()
{
MyAskDialog dlg(...);
if ( dlg.ShowModal() == wxID_OK )
// ...
// no need to call Destroy() here
}
支持样式
wxCAPTION:
在对话框上放置标题。
wxDEFAULT_DIALOG_STYLE:
相当于wxCAPTION、wxCLOSE_BOX和wxSYSTEM_MENU的组合(最后一个在Unix下不使用)。
wxRESIZE_ORDER(大小排序):
在窗口周围显示可调整大小的框架。
wxSYSTEM_菜单:
显示系统菜单。
wxCLOSE_BOX:
在框架上显示关闭框。
wx最大值箱:
在对话框上显示最大化框。
使用此类的事件
最小尺寸箱:
在对话框上显示最小化框。
wx厚度框架:
在窗口周围显示一个粗框。
wxSTAY_ON_TOP:
该对话框位于所有其他窗口的顶部。
wxNO_3D:
这种样式已经过时,不再做任何事情,不要在任何新代码中使用它。
wxDIALOG_NO_PARENT:
默认情况下,使用NULL父窗口创建的对话框将被赋予应用程序的顶级窗口作为父窗口。使用此样式可防止发生这种情况,并创建孤立对话框。这不建议用于模式对话框。
wxDIALOG_EX_CONTEXTHELP:
在Windows下,在标题上放置一个查询按钮。按下时,Windows将进入上下文相关帮助模式,如果用户单击应用程序窗口,wxWidgets将发送wxEVT_help事件。请注意,这是一种扩展样式,必须在调用Create(两步构造)之前通过调用SetExtraStyle()进行设置。
wxDIALOG_EX_金属:
在macOS上,这种风格的框架将以金属外观显示。这是一种额外的风格。
在Unix或Linux下,MWM(Motif窗口管理器)或其他识别MHM提示的窗口管理器应该运行,以使这些样式中的任何一种都能产生效果。
此类发出的事件
以下事件处理程序宏将事件重定向到具有如下原型的成员函数处理程序“func”:
void handlerFuncName(wxCloseEvent& event)
此类发出的事件的事件宏:
EVT_CLOSE(函数):
对话框正在由用户或以编程方式关闭(参阅wxWindow::Close)。如果存在关闭按钮(通常是标题栏右上角的“X”),用户可以通过单击该按钮生成此事件(请参见wxCLOSE_BOX样式)。
EVT_INIT_DIALOG(函数):
处理wxEVT_INIT_DIALOG事件。
wxInitDialogEvent在初始化对话框或面板时发送。
此事件的处理程序可以将数据传输到窗口。
默认处理程序调用wxWindow::TransferDataToWindow。
使用此类的事件
以下事件处理程序宏将事件重定向到具有如下原型的成员函数处理程序“func”:
void handlerFuncName(wxInitDialogEvent&event)
事件宏:
EVT_INIT_DIALOG(函数):
处理wxEVT_INIT_DIALOG事件。
wxWindow::Close()
bool wxWindow::Close ( bool force = false )
此函数只生成一个wxCloseEvent,其处理程序通常尝试关闭窗口。
然而,它不会关闭窗口本身。
参数
如果窗口的关闭处理程序应该能够否决对该窗口的破坏,则强制为false;如果不能否决,则为true。
返回
如果事件已处理且未被否决,则为true,否则为false。
Close调用窗口的关闭处理程序,为窗口提供选择是否销毁窗口的机会。通常,它只用于顶层窗口(wxFrame和wxDialog类),因为其他窗口不应该有任何特殊的OnClose()逻辑。
关闭处理程序应该使用wxCloseEvent::CanVeto检查窗口是否被强制删除,在这种情况下,它应该使用wxWindow::destroy销毁窗口。
请注意,调用Close并不保证该窗口将被销毁;但它提供了一种模拟手动关闭窗口的方法,这可以通过破坏窗口来实现,也可以不实现。
wxDialog::OnCloseWindow的默认实现不一定会删除该对话框,因为它只会模拟一个wxID_CANCEL事件,该事件由适当的按钮事件处理程序处理,可以执行任何操作。要确保窗口将被销毁,请改为调用wxWindow::Destroy
应用程序可以为对话框定义wxCloseEvent处理程序,以响应系统关闭事件。
wxCloseEvent
具体描述
此事件类包含有关窗口和会话关闭事件的信息。
当用户尝试使用窗口管理器(X)或系统菜单(Windows)关闭框架或对话框时,将调用EVT_CLOSE的处理程序函数。它也可以由应用程序本身以编程方式调用,例如通过调用wxWindow::Close函数。
您应该使用wxCloseEvent::CanVeto检查应用程序是否强制删除窗口。如果为false,则必须使用wxWindow::destroy销毁窗口。
如果返回值为真,则取决于您是否通过销毁窗口进行响应。
如果不销毁该窗口,则应调用wxCloseEvent::Veto,让调用代码知道您没有销毁该窗口。这允许wxWindow::Close函数返回true或false,具体取决于关闭指令是否得到执行。
void MyFrame::OnClose(wxCloseEvent& event)
{
if ( event.CanVeto() && m_bFileNotSaved )
{
if ( wxMessageBox("The file has not been saved... continue closing?",
"Please confirm",
wxICON_QUESTION | wxYES_NO) != wxYES )
{
event.Veto();
return;
}
}
Destroy(); // you may also do: event.Skip();
// since the default event handler does call Destroy(), too
}
EVT_END_SESSION事件略有不同,因为它是在用户会话结束时(例如,由于注销或关闭)由系统发送的,因此所有窗口都被强制关闭。
至少在MSW下,在执行该事件的处理程序后,程序被系统简单地终止。因此,wxWidgets提供的此事件的默认处理程序调用所有常用的清理代码(包括wxApp::OnExit()),以便它仍然可以执行,exit()将进程本身退出,而无需等待被终止。如果由于某种原因不希望出现这种行为,请确保在wxApp派生类中为该事件定义了一个处理程序,并且不要在其中调用event.Skip()(但要注意,系统仍然会终止应用程序)。
使用此类的事件
以下事件处理程序宏将事件重定向到具有如下原型的成员函数处理程序“func”:
void handlerFuncName(wxCloseEvent事件)
事件宏:
EVT_CLOSE(函数):
处理wxEVT_CLOSE_WINDOW命令事件,提供成员函数。此事件适用于wxFrame和wxDialog类。
EVT_QUERY_END_SESSION(函数):
处理wxEVT_QUERY_END_SESSION会话事件,提供成员函数。此事件只能在wxApp派生类中处理。
EVT_END_SESSION(函数):
处理wxEVT_END_SESSION会话事件,提供成员函数。此事件只能在wxApp派生类中处理。