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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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