# 8.4 输入对话框
这一类对话框让用户自己输入信息,包括:wxNumberEntryDialog, wxTextEntryDialog, wxPasswordEntryDialog和 wxFindReplaceDialog.
wxNumberEntryDialog
wxNumberEntryDialog提示用户输入一个固定范围内的数字,这个对话框包含一个spin控件因此,用户既可以手动输入数字,也可以通过鼠标点击spin按钮来调整数字的值,这个对话框是wxWidgets自己实现的,因此在各个平台上的表现都是相似的.
创建wxNumberEntryDialog需要提供的参数包括一个父窗口,消息文本,提示文本(显示在spin控件的前面),标题文本,默认值,最小值和最大值,位置等,然后调用ShowDialog函数,如果返回wxID_OK,则可以调用GetValue函数返回用户输入的数字的值.
下图演示了其在windows平台上的样子:
![](img/mht9AB%281%29.tmp)
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平台上的例子:
![](img/mht9AE%281%29.tmp)
创建这两个对话框需要提供的参数包括父窗口指针,消息文本,标题文本,默认文本和一个类型参数.类型参数是一个比特位列表,其值为 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系统上的查找和替换对话框:
![](img/mht9C1%281%29.tmp)
在其它平台(比如GTK+或Mac OS X)上, wxWidgets使用自己实现的通用版对话框,如下图所示:
![](img/mht9C4%281%29.tmp)
处理这个对话框相关的事件
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;
}
```
- 第一章 介绍
- 1.1 为什么要使用wxWidgets?
- 1.2 wxWidgets的历史
- 1.3 wxWidgets社区
- 1.4 wxWidgets和面向对象编程
- 1.5 wxWidgets的体系结构
- 1.6 许可协议
- 第一章小结
- 第二章 开始使用
- 2.1 一个小例子
- 2.2 应用程序类
- 2.3 Frame窗口类
- 2.4 事件处理函数
- 2.5 Frame窗口的构造函数
- 2.6 完整的例子
- 2.7 wxWidgets程序一般执行过程
- 2.8 编译和运行程序
- 第二章小结
- 第三章 事件处理
- 3.1 事件驱动编程
- 3.2 事件表和事件处理过程
- 3.3 过滤某个事件
- 3.4 挂载事件表
- 3.5 动态事件处理方法
- 3.6 窗口标识符
- 3.7 自定义事件
- 第三章小结
- 第四章 窗口的基础知识
- 4.1 窗口解析
- 4.2 窗口类概览
- 4.3 基础窗口类
- 4.4 顶层窗口
- 4.5 容器窗口
- 4.6 非静态控件
- 4.7 静态控件
- 4.8 菜单
- 4.9 控制条
- 第四章小结
- 第五章绘画和打印
- 5.1 理解设备上下文
- 5.2 绘画工具
- 5.3 设备上下文中的绘画函数
- 5.4 使用打印框架
- 5.5 使用wxGLCanvas绘制三维图形
- 第五章小节
- 第六章处理用户输入
- 6.1 鼠标输入
- 6.2 处理键盘事件
- 6.3 处理游戏手柄事件
- 第六章小结
- 第七章使用布局控件进行窗口布局
- 7.1 窗口布局基础
- 7.2 窗口布局控件
- 7.3 使用布局控件进行编程
- 7.4 更多关于布局的话题
- 第七章小结
- 第八章使用标准对话框
- 8.1信息对话框
- 8.2 文件和目录对话框
- 8.3 选择和选项对话框
- 8.4 输入对话框
- 8.5 打印对话框
- 第八章小结
- 第九章创建定制的对话框
- 9.1 创建定制对话框的步骤
- 9.2 一个例子:PersonalRecordDialog
- 9.3 在小型设备上调整你的对话框
- 9.4 一些更深入的话题
- 9.5 使用wxWidgets资源文件
- 第九章小结
- 第十章使用图像编程
- 10.1 wxWidgets中图片相关的类
- 10.2 使用wxBitmap编程
- 10.3 使用wxIcon编程
- 10.4 使用wxCursor编程
- 10.5 使用wxImage编程
- 10.6 图片列表和图标集
- 10.7 自定义wxWidgets提供的小图片
- 第十章小结
- 第十一章剪贴板和拖放操作
- 11.1 数据对象
- 11.2 使用剪贴板
- 11.3 实现拖放操作
- 第十一章小结
- 第十二章高级窗口控件
- 12.1 wxTreeCtrl
- 12.2 wxListCtrl
- 12.3 wxWizard
- 12.4 wxHtmlWindow
- 12.5 wxGrid
- 12.6 wxTaskBarIcon
- 12.7 编写自定义的控件
- 第十二章小结
- 第十三章数据结构类
- 13.1 为什么没有使用STL?
- 13.2 字符串类型
- 13.3 wxArray
- 13.4 wxList和wxNode
- 13.5 wxHashMap
- 13.6 存储和使用日期和时间
- 13.7 其它常用的数据类型
- 第十三章小结
- 第十四章文件和流操作
- 14.1 文件类和函数
- 14.2 流操作相关类
- 第十四章小结
- 第十五章内存管理,调试和错误处理
- 15.1 内存管理基础
- 15.2 检测内存泄漏和其它错误
- 15.3 构建自防御的程序
- 15.4 错误报告
- 15.5 提供运行期类型信息
- 15.6 使用wxModule
- 15.7 加载动态链接库
- 15.8 异常处理
- 15.9 调试提示
- 第十五章小结
- 第十六章编写国际化程序
- 16.1 国际化介绍
- 16.2 从翻译说起
- 16.3 字符编码和Unicode
- 16.4 数字和日期
- 16.5 其它媒介
- 16.6 一个小例子
- 第十六章小结
- 第十七章编写多线程程序
- 17.1 什么时候使用多线程,什么时候不要使用
- 17.2 使用wxThread
- 17.3 用于线程同步的对象
- 17.4 多线程的替代方案
- 第十七章小结
- 第十八章使用wxSocket编程
- 18.1 Socket类和功能概览
- 18.2 Socket及其基本处理介绍
- 18.3 Socket标记
- 18.4 使用Socket流
- 18.5 替代wxSocket
- 第十八章小结
- 第十九章使用文档/视图框架
- 19.1 文档/视图基础
- 19.2 文档/视图框架的其它能力
- 19.3 实现Undo/Redo的策略
- 第十九章小结
- 第二十章完善你的应用程序
- 20.1 单个实例和多个实例
- 20.2 更改事件处理机制
- 20.3 降低闪烁
- 20.4 实现联机帮助
- 20.5 解析命令行参数
- 20.6 存储应用程序资源
- 20.7 调用别的应用程序
- 20.8 管理应用程序设置
- 20.9 应用程序安装
- 20.10 遵循用户界面设计规范
- 20.11 全书小结