8.4 输入对话框

这一类对话框让用户自己输入信息,包括:wxNumberEntryDialog, wxTextEntryDialog, wxPasswordEntryDialog和 wxFindReplaceDialog.

wxNumberEntryDialog

wxNumberEntryDialog提示用户输入一个固定范围内的数字,这个对话框包含一个spin控件因此,用户既可以手动输入数字,也可以通过鼠标点击spin按钮来调整数字的值,这个对话框是wxWidgets自己实现的,因此在各个平台上的表现都是相似的.

创建wxNumberEntryDialog需要提供的参数包括一个父窗口,消息文本,提示文本(显示在spin控件的前面),标题文本,默认值,最小值和最大值,位置等,然后调用ShowDialog函数,如果返回wxID_OK,则可以调用GetValue函数返回用户输入的数字的值.

下图演示了其在windows平台上的样子:

wxNumberEntryDialog使用举例

上图中的对话框是用下面的代码创建的:

#include "wx/numdlg.h"
wxNumberEntryDialog dialog(parent,
  wxT("This is some text, actually a lot of text\nEven two rows of text"),
  wxT("Enter a number:"), wxT("Numeric input test"), 50, 0, 100);
if (dialog.ShowModal() == wxID_OK)
{
  long value = dialog.GetValue();
}

wxTextEntryDialog和wxPasswordEntryDialog

wxTextEnTRyDialog和wxPasswordEntryDialog提供一个消息文本和一个单行文本框控件,以便用户可以输入文本,它们的功能很类似,只不过在wxPasswordEntryDialog中输入的文本被以掩码的方式显示,因此是不能直接看到的. 下图演示了wxTextEntryDialog对话框在windows平台上的例子:

创建这两个对话框需要提供的参数包括父窗口指针,消息文本,标题文本,默认文本和一个类型参数.类型参数是一个比特位列表,其值为 wxOK, wxCANCEL,wxCENTRE(或者wxCENTER)等,你还可以传递wxTextCtrl的窗口类型wxTE_CENTRE(或 wxTE_CENTER)等.

你可以使用SetValue函数单独设置其默认文本,还可以使用GetValue函数获取用户输入的文本.

wxTextEntryDialog使用举例

上图演示的对话框是用下面的代码创建的:

#include "wx/textdlg.h"
wxTextEntryDialog dialog(this,
                           wxT("This is a small sample\n")
                           wxT("A long, long string to test out the text entrybox"),
                           wxT("Please enter a string"),
                           wxT("Default value"),
                           wxOK | wxCANCEL);
if (dialog.ShowModal() == wxID_OK)
    wxMessageBox(dialog.GetValue(), wxT("Got string"));

wxFindReplaceDialog

wxFindReplaceDialog是一个非模式对话框,它允许用户用来输入用于搜索的文本以及(如果需要的话)用来替换的文本.实际的搜索动作需要在其派生类或者其父窗口作为这个对话框某个按钮时间的响应来完成.和大多数标准对话框不同,这种对话框必须拥有一个父窗口(非空),并且这个对话框必须是非模式显示的,无论是基于设计还是实现来说.

下图演示了windows系统上的查找和替换对话框:

在其它平台(比如GTK+或Mac OS X)上, wxWidgets使用自己实现的通用版对话框,如下图所示:

处理这个对话框相关的事件

wxFindReplaceDialog对话框在用户点击其上的按钮的时候产生一些命令事件.事件处理函数采用wxFindDialogEvent类型的参数,事件映射宏中的窗口标识符为这个对话框的标识符,这些宏如下表所示:

EVT_FIND(id, func) 当"查找"按钮被按下时产生.
EVT_FIND_NEXT(id, func) 当"下一个"按钮被按下时产生.
EVT_FIND_REPLACE(id, func) 当"替换"按钮被按下时产生.
EVT_FIND_REPLACE_ALL(id, func) 当"替换全部"按钮被按下时产生.
EVT_FIND_CLOSE(id, func) 当用户通过取消或者别的途径关闭对话框的时候产生.

wxFindDialogEvent的成员函数

GetFlags返回下列值的一组比特位列表:wxFR_DOWN, wxFR_WHOLEWORD和wxFR_MATCHCASE.

GetFindString返回用户输入的要查找的文本.

GetreplaceString返回用户输入的要替换的文本.

Getdialog返回一个指向产生这个事件的对话框的指针.

向对话框传递数据

创建wxFindReplaceDialog需要传递的参数包括一个父窗口,一个指向wxFindReplaceData的指针,标题文本和一个类型,类型是下表所示比特值的列表:

wxFR_REPLACEDIALOG 指定对话框是查找替换对话框,而不是查找对话框.
wxFR_NOUPDOWN 只是查找方向不允许被改变.
wxFR_NOMATCHCASE 支持仅允许大小敏感的搜索或替换.
wxFR_NOWHOLEWORD 指定不支持整字搜索的选项.

wxFindReplaceData保存了所有wxFindReplaceDialog相关的信息.用来对 wxFindReplaceDialog对象进行初始化的动作以及用来在wxFindReplaceDialog对话框关闭以后保存其相关的信息,它的值也会在每次产生wxFindDialogEvent事件的时候自动更新,因此你可以直接使用它的成员函数来代替使用wxFindDialogEvent事件的成员函数.使用对话框的GetData函数可以返回在构造对话框的时候填充的wxFindReplaceData对象指针.

wxFindReplaceData的成员函数

下面列出了wxFindReplaceData的用来设置或者获取相关数据的函数,注意那些用于设置的函数只在这个对话框显示之前有用,在对话框显示以后,调用这些用于设置的函数是没有任何效果的.

GetFindString和SetFindString用来设置或者获取要查找的字符串.

GetFlags和SetFlags用来设置或者获取查找替换对话框选项的相应状态(前面已经有具体描述).

GetreplaceString和SetReplaceString用来设置或者获取要替换成的字符串.

查找和替换使用举例

下面演示了查找和替换对话框的使用方法,其中DoFind和DoReplace函数的代码没有列出来,它们用来进行应用程序相关的查找和替换动作.同时,这些函数还应该维护一组应用程序相关的变量,用来保存当前查找的位置,以便下次查找在这之后进行,这些函数还应该完成文档视图相匹配部分的高亮显示.

#include "wx/fdrepdlg.h"
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(ID_REPLACE, MyFrame::ShowReplaceDialog)
     EVT_FIND(wxID_ANY, MyFrame::OnFind)
     EVT_FIND_NEXT(wxID_ANY, MyFrame::OnFind)
     EVT_FIND_REPLACE(wxID_ANY, MyFrame::OnReplace)
     EVT_FIND_REPLACE_ALL(wxID_ANY, MyFrame::OnReplaceAll)
     EVT_FIND_CLOSE(wxID_ANY, MyFrame::OnFindClose)
END_EVENT_TABLE()
void MyFrame::ShowReplaceDialog( wxCommandEvent& event )
{
    if ( m_dlgReplace )
    {
        delete m_dlgReplace;
        m_dlgReplace = NULL;
    }
    else
    {
        m_dlgReplace = new wxFindReplaceDialog
                           (
                            this,
                            &m_findData,
                            wxT("Find and replace dialog"),
                            wxFR_REPLACEDIALOG
                           );
        m_dlgReplace->Show(true);
    }
}
void MyFrame::OnFind(wxFindDialogEvent& event)
{
    if (!DoFind(event.GetFindString(), event.GetFlags()))
    {
        wxMessageBox(wxT("No more matches."));
    }
}
void MyFrame::OnReplace(wxFindDialogEvent& event)
{
    if (!DoReplace(event.GetFindString(), event.GetReplaceString(),
        event.GetFlags(), REPLACE_THIS))
    {
        wxMessageBox(wxT("No more matches."));
    }
}
void MyFrame::OnReplaceAll(wxFindDialogEvent& event)
{
    if (DoReplace(event.GetFindString(), event.GetReplaceString(),
        event.GetFlags(), REPLACE_ALL))
    {
        wxMessageBox(wxT("Replacements made."));
    }
    else
    {
        wxMessageBox(wxT("No replacements made."));
    }
}
void MyFrame::OnFindClose(wxFindDialogEvent& event)
{
    m_dlgReplace->Destroy();
    m_dlgReplace = NULL;
}