8.1 信息对话框
在这一小节中,我们来看看以下四种用来提供信息的对话框:wxMessageDialog, wxProgressDialog, wxBusyInfo, and wxShowTip。
wxMessageDialog
这种对话框显示一个消息和一组按钮,按钮可以为 OK, Cancel, Yes 或者 No,还可以有一个可选的图标,用来显示一个惊叹号或者一个问号.消息文本中还可以包含换行符"\n"。
wxMessageDialog::ShowModal 函数的返回值用来表征哪个按钮被按下了。
下图显示了 wxMessageDialog 在 windows 平台上的样子:
在 GTK+平台上:
在 Mac 平台上:
要创建一个这种对话框,你需要提供父窗口指针,要显示的消息,可选的标题,类型和位置参数,然后调用 ShowModal 函数显示这个对话框,然后判断这个函数的返回值进行进一步的动作。
其中的类型参数是一个比特位列表,其值如下表所示:
wxOK | 显示一个 OK 按钮。 |
---|---|
wxCANCEL | 显示一个 Cancel 按钮。 |
wxYES_NO | 显示 Yes 和 No 按钮。 |
wxYES_DEFAULT | 设置 Yes 为默认按钮. 和 wxYES_NO 一起使用.这是 wxYES_NO 类型的默认行为。 |
wxNO_DEFAULT | 设置 No 按钮为默认按钮,和 wxYES_NO 一起使用。 |
wxICON_EXCLAMATION | 显示一个惊叹号。 |
wxICON_ERROR | 显示一个错误图标。 |
wxICON_HAND | 和 wxICON_ERROR 相同。 |
wxICON_QUESTION | 显示一个问号。 |
wxICON_INFORMATION | 显示一个信息图标。 |
wxSTAY_ON_TOP | 在 windows 平台上,这个对话框将在所有的窗口(包括那些其它应用程序的窗口) 之上。 |
wxMessageDialog 使用举例
#include "wx/msgdlg.h"
wxMessageDialog dialog( NULL, wxT("Message box caption"),
wxT("Message box text"),
wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION);
switch ( dialog.ShowModal() )
{
case wxID_YES:
wxLogStatus(wxT("You pressed \"Yes\""));
break;
case wxID_NO:
wxLogStatus(wxT("You pressed \"No\""));
break;
case wxID_CANCEL:
wxLogStatus(wxT("You pressed \"Cancel\""));
break;
default:
wxLogError(wxT("Unexpected wxMessageDialog return code!"));
}
wxMessageBox
你可以使用更方便的 wxMessageBox 函数,它的参数为一个消息文本,标题文本,类型和父窗口.例如:
if (wxYES == wxMessageBox(wxT("Message box text"),
wxT("Message box caption"),
wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION,
parent))
{
return true;
}
要注意 wxMessageBox 的返回值和 wxMessageDialog::ShowModal 的返回值是不一样的,前者返回 wxOK, wxCANCEL, wxYES 或 wxNO,而后者返回 wxID_OK, wxID_CANCEL, wxID_YES 或 wxID_NO。
wxProgressDialog
wxProgressDialog 可以用来显示一个短的消息文本和一个进度条用来指示用户还需要等待多久.它还可以显示一个 Cancel 按钮用来中止正在进行的处理,还可以显示已经过去的时间,估计剩余的时间和估计全部的时间.这个对话框是 wxWidgets 在各个平台上自己实现的.下图显示了这个对话框在 windows 上的样子:
你既可以用全局变量或者 new 函数来创建这种对话框,也可以直接使用局部变量创建这种对话框,需要传递的参数包括:标题,消息文本,进度条的最大值,父窗口和类型。
类型的值如下表所示:
wxPD_APP_MODAL | 设置为模式对话框.如果没有设置这个类型,对话框为非模式对话框,意味着除了其父窗口以外,应用程序中其它的窗口还可以输入数据。 |
---|---|
wxPD_AUTO_HIDE | 导致这个进度条对话框在进度达到最大值的时候自动消失。 |
wxPD_CAN_ABORT | 告诉对话框显示一个取消按钮,当用户点击这个按钮以后,下次调用对话框的 Update 函数将会返回失败。 |
wxPD_ELAPSED_TIME | 显示已逝去时间标签。 |
wxPD_ESTIMATED_TIME | 显示估计全部时间标签。 |
wxPD_REMAINING_TIME | 显示估计剩余时间标签。 |
在进度对话框被创建以后,其父窗口将被禁用,如果设置了 wxPD_APP_MODAL 类型,则应用程序中其它的窗口也将被禁用.应用程序应用调用 Update 函数来更新进度条以及提示信息,如果设置了时间显示标签,则它们的值将被自动计算并在每次调用 Update 的时候刷新。
如果设置了 wxPD_AUTO_HIDE 类型,对话框会在进度达到最大值的时候自动隐藏,你应该自己根据其创建方式释放这个对话框.对于由于用户点击取消按钮而导致 Update 失败的情况,如果你愿意,你可以使用 Resume 函数还恢复中止的进度条。
wxProgressDialog 使用举例
#include "wx/progdlg.h"
void MyFrame::ShowProgress()
{
static const int max = 10;
wxProgressDialog dialog(wxT("Progress dialog example"),
wxT("An informative message"),
max, // range
this, // parent
wxPD_CAN_ABORT |
wxPD_APP_MODAL |
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME);
bool cont = true;
for ( int i = 0; i <= max; i++ )
{
wxSleep(1);
if ( i == max )
cont = dialog.Update(i, wxT("That's all, folks!"));
else if ( i == max / 2 )
cont = dialog.Update(i, wxT("Only a half left (very long message)!"));
else
cont = dialog.Update(i);
if ( !cont )
{
if ( wxMessageBox(wxT("Do you really want to cancel?"),
wxT("Progress dialog question"),
wxYES_NO | wxICON_QUESTION) == wxYES )
break;
dialog.Resume();
}
}
if ( !cont )
wxLogStatus(wxT("Progress dialog aborted!"));
else
wxLogStatus(wxT("Countdown from %d finished"), max);
}
wxBusyInfo
wxBusyInfo 其实不是一个对话框不过它的表现和对话框非常相似,当这个对象被创建的时候,屏幕上将显示一个窗口以及一条让用户耐心等待的消息,这个窗口将存在于 wxBusyInfo 的整个生命周期.在 windows 平台上,它的长相类似下面的样子:
wxBusyInfo 也可以以全局和局部的方式创建,需要传递给构造函数的参数包括一个消息文本和一个父窗口。
wxBusyInfo 使用举例
在下面的例子中,首先使用 wxWindowDisabler 对象禁用应用程序当前创建的所有的窗口,然后显示了一个 wxBusyInfo 窗口:
#include "wx/busyinfo.h"
wxWindowDisabler disableAll;
wxBusyInfo info(wxT("Counting, please wait..."), parent);
for (int i = 0; i < 1000; i++)
{
DoCalculation();
}
wxShowTip
许多应用程序都会在程序启动的时候显示一个附加的窗口,用来给出一些如何使用这个应用程序的提示信息,那些不愿阅读沉闷的文档的人会非常喜欢这样的学习方式的。
启动提示窗口在 windows 平台上的样子如下图所示:
和大多数对话框不同,这个对话框是使用 wxShowTip 函数显示的,传递的参数为一个父窗口指针,一个指向 wxTipProvider 对象的指针和一个可选的 bool 参数用来指示是否显示一个复选框,以便用户可以选择是否在应用程序启动的时候显示这个提示框.而函数的返回值则为用户的选择。
你必须实现一个 wxTipProvider 的派生类,实现其中的 GetTip 函数才可以使用 wxShowTip 函数,幸运的是, wxWidgets 已经实现了一个这样的基于文本文件的类.你可以直接使用 wxCreateFileTipProvider 函数,传递以文本文件(每行一个提示文本) 路径和默认选择索引来创建一个这样的类。
应用程序应负责在 wxTipProvider 对象不需要的时候释放这个对象。
wxShowTip 使用举例
#include "wx/tipdlg.h"
void MyFrame::ShowTip()
{
static size_t s_index = (size_t)-1;
if ( s_index == (size_t)-1 )
{
// 随机化...
srand(time(NULL));
// ...选择一个提示
s_index = rand() % 5;
}
// 传递一个提示文件以及提示索引
wxTipProvider *tipProvider =
wxCreateFileTipProvider(wxT("tips.txt"), s_index);
m_showAtStartup = wxShowTip(this, tipProvider, true);
delete tipProvider;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论