4.6 非静态控件
非静态控件指的是那些可以响应鼠标和键盘事件的类似 wxButton 和 wxListBox 之类的控件。这里我们会对其中最基本的那些进行一些描述。更高级的内容被安排在第 12 章,你可以参考附录 E 中的方法从网上下载或者创建你自己的更高级的控件。
wxButton
wxButton 控件看上去象是一个物理上可以按下的按钮,它拥有一个文本标签,是用户界面中最常用的一个元素,它可以被放置在对话框,或者面板(wxPanel) 或者几乎任何其它的窗口中。当用户点击按钮的时候,会产生一个命令类型的事件。
下面是创建按钮的一个简单的例子:
#include "wx/button.h"
wxButton* button = new wxButton(panel, wxID_OK, wxT("OK"),
wxPoint(10, 10), wxDefaultSize);
下图演示了按钮在 Windows Xp 系统上的默认外观:
wxWidgets 创建的按钮的默认大小是依靠静态函数 wxButton::GetDefaultSize 指定的,这个函数在不同的平台上返回不同的值。不过你可以通过给按钮指定 wxBU_EXACTFIT 类型来使其产生刚好符合其标签尺寸的大小。
wxButton 的窗口类型
wxBU_LEFT | 标签文本作对齐. 仅适用于 Windows 和 GTK+平台。 |
---|---|
wxBU_TOP | 标签文本上对齐. 仅适用于 Windows 和 GTK+平台。 |
wxBU_RIGHT | 标签文本右对齐。仅适用于 Windows 和 GTK+。 |
wxBU_BOTTOM | 标签文本对齐按钮底部. 仅适用于 Windows 和 GTK+平台。 |
wxBU_EXACTFIT | 不使用默认大小创建按钮,而是按照其标签文本的大小来创建按钮。 |
wxNO_BORDER | 创建一个平面按钮。仅适用于 Windows 和 GTK+平台。 |
wxButton 的事件
wxButton 可以创建类型为 wxCommandEvent 的事件,如下表所示:
EVT_BUTTON(id,func) | 用于处理 wxEVT_COMMAND_BUTTON_CLICKED 事件,在用户用左键单击按钮的时候产生。 |
wxButton 的成员函数
wxButton 的成员函数
SetLabel 和 GetLabel 函数用来操作按钮标签文本.你可以使用"&"前导符来指示用于这个按钮的快捷键,仅适用于 Windows 和 GTK+平台. SetDefault 将按钮设置为其父窗口的默认按钮,这样用户按回车键就相当于用左键点击了这个按钮。
wxButton 的标签
你可以使用一个前导符"&"来指定其后的字符为这个按钮的快捷键,不过这个操作仅适用于 Windows 和 GTK+的版本,在其它的平台上,这个前导符将被简单的忽略。
在某些系统,尤其是 GTK+系统中,例如确定或者新建这样的标准按钮的标签以及附带显示的一些小图片都被进行了默认的定义。在 wxWidgets 中,通常 你只需要指定这个按钮的标识符为系统预定义的标识符,那么这些预定义的标签和小图片将被显示,不过,指定和默认值不同的标签文本以及小图片的操作都是允许 的。
推荐的对于这些预定义按钮的使用方法如下,你只需要指定预定义的标识符,不需要指定标签文本,或者指定标签文本为空字符串:
wxButton* button = new wxButton(this, wxID_OK);
wxWidgets 会各种平台提供合适的标签,在上面的例子中,在 windows 或者 Mac OSX 平台上,将使用字符串"&OK",而在 GTK+系统中,会使用当前语言下的 OK 按钮标签。然后如果你提供了自己的标签文本, wxWidgets 将会按照你的指示办事:
wxButton* button = new wxButton(this, wxID_OK, wxT("&Apply"));
这会导致无论在哪种平台上,这个按钮都将覆盖标准标识符的定义,使用"Apply"作为这个按钮的标签。
你可以使用 wxGetStockLabel 函数(需要包含 wx/stockitem.h 这个头文件) 来获得某个预定义窗口标识符的标签,使用窗口标识符和 true(如果你希望在返回的结果中包含前导符(&))作为参数。
下表列出了预定义标识符和其默认标签的对应关系。
预定义标识符 | 预定义标签 |
---|---|
wxID_ADD | "Add" |
wxID_APPLY | "&Apply" |
wxID_BOLD | "&Bold" |
wxID_CANCEL | "&Cancel" |
wxID_CLEAR | "&Clear" |
wxID_CLOSE | "&Close" |
wxID_COPY | "&Copy" |
wxID_CUT | "Cu&t" |
wxID_DELETE | "&Delete" |
wxID_FIND | "&Find" |
wxID_REPLACE | "Rep&lace" |
wxID_BACKWARD | "&Back" |
wxID_DOWN | "&Down" |
wxID_FORWARD | "&Forward" |
wxID_UP | "&Up" |
wxID_HELP | "&Help" |
wxID_HOME | "&Home" |
wxID_INDENT | "Indent" |
wxID_INDEX | "&Index" |
wxID_ITALIC | "&Italic" |
wxID_JUSTIFY_CENTER | "Centered" |
wxID_JUSTIFY_FILL | "Justified" |
wxID_JUSTIFY_LEFT | "Align Left" |
wxID_JUSTIFY_RIGHT | "Align Right" |
wxID_NEW | "&New" |
wxID_NO | "&No" |
wxID_OK | "&OK" |
wxID_OPEN | "&Open" |
wxID_PASTE | "&Paste" |
wxID_PREFERENCES | "&Preferences" |
wxID_PRINT | "&Print" |
wxID_PREVIEW | "Print previe&w" |
wxID_PROPERTIES | "&Properties" |
wxID_EXIT | "&Quit" |
wxID_REDO | "&Redo" |
wxID_REFRESH | "Refresh" |
wxID_REMOVE | "Remove" |
wxID_REVERT_TO_SAVED | "Revert to Saved" |
wxID_SAVE | "&Save" |
wxID_SAVEAS | "Save &As..." |
wxID_STOP | "&Stop" |
wxID_UNDELETE | "Undelete" |
wxID_UNDERLINE | "&Underline" |
wxID_UNDO | "&Undo" |
wxID_UNINDENT | "&Unindent" |
wxID_YES | "&Yes" |
wxID_ZOOM_100 | "&Actual Size" |
wxID_ZOOM_FIT | "Zoom to &Fit" |
wxID_ZOOM_IN | "Zoom &In" |
wxID_ZOOM_OUT | "Zoom &Out" |
wxBitmapButton
和普通按钮唯一不同的地方在于,它将显示一个小图片而不是标签文本。
下面演示了创建一个图片按钮的方法:
#include "wx/bmpbuttn.h"
wxBitmap bitmap(wxT("print.xpm"), wxBITMAP_TYPE_XPM);
wxBitmapButton* button = new wxBitmapButton(panel, wxID_OK,
bitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW);
以及在 Windows 平台上的显示效果:
图片按钮通常只需要指定一个拥有透明背景的图片,wxWidgets 将会在任何状态的时候都使用这个图片,不过如果你愿意,你可以给不同的按钮状态指定不同的图片,比如选中状态,释放按钮状态以及不可用状态等。
XPM 图片格式是推荐的图片格式,因为它可以很容易的提供透明相关的信息以及可以被包含在 C++代码中。不过加载别的格式的图片也是可以的,比如常见的 JPEG,PNG,GIF 以及 BMP 格式。
wxBitmapButton 的窗口类型
wxBU_AUTODRAW | 如果指定了这个类型,图片按钮将只会使用标签图片以系统默认的方式自动被绘制,它将包含边框和 3D 的外观。如果没有指定这个类型,图片按钮将按照不同状态提供的不同的图片来进行绘制. 这个类型仅适用于 Windows 和 Mac OS。 |
---|---|
wxBU_LEFT | 图片左对齐. 在 Mac OS 上忽略这个类型。 |
wxBU_TOP | 图片顶端对齐. Mac OS 不适用。 |
wxBU_RIGHT | 图片右对齐. Mac OS 不适用。 |
wxBU_BOTTOM | 图片底端对齐. Mac OS 不适用。 |
wxBitmapButton 事件
图片按钮的事件和 wxButton 完全相同。
wxBitmapButton 的成员函数
SetBitmapLabel 和 GetBitmapLabel 用来操作按钮的主要标签图片. 你还可以使用 SetBitmapFocus, SetBitmapSelected, 和 SetBitmapDisabled 函数来设置按钮被激活,被按下以及被禁用状态下对应的图片。
SetDefault 将按钮设置为其父窗口的默认按钮,这样用户按回车键就相当于用左键点击了这个按钮。
wxChoice
选择控件由一个只读的文本区域组成,这个区域的文本通过对一个附属的下拉列表框中值进行选择来进行赋值。这个下拉列表框是默认不可见的,只有在用户用鼠标点击下拉按钮以后才会显示。
创建一个选择控件的代码如下,其中的参数含义依次为:父窗口,标识符,位置,大小,窗口类型以及文本选项。
#include "wx/choice.h"
wxArrayString strings;
strings.Add(wxT("One"));
strings.Add(wxT("Two"));
strings.Add(wxT("Three"));
wxChoice* choice = new wxChoice(panel, ID_COMBOBOX,
wxDefaultPosition, wxDefaultSize, strings);
在大多数平台上,除了文本区域的文本是只读的以外,选择控件和 wxComboBox(如下图所示) 是非常相似的。在 GTK+平台上,选择控件是一个拥有一 个下拉菜单的按钮。你可以用过设置 wxComboBox 窗口的只读属性来模拟选择控件,以便能够使得在选项过多的时候使用滚动条。
wxChoice 的窗口类型
wxChoice 控件没有特别的窗口类型。
wxChoice 的事件
wxChoice 控件产生 wxCommandEvent 类型的事件,如下表所示:
VT_CHOICE(id,func) | 用于处理 wxEVT_COMMAND_CHOICE_SELECTED 事件,当有用户通过列表选择某个选项的时候产生。 |
wxChoice 的成员函数
wxChoice 相关的成员函数都是前面介绍过的 wxControlWithItems 类的函数,如: Clear, Delete, FindString, GetClientData, GetClientObject, SetClientData, SetClientObject, GetCount, GetSelection, SetSelection, GetString, SetString, GetStringSelection, SetStringSelection, Insert, 和 IsEmpty。
wxComboBox
ComboBox 是一个单行编辑框和一个列表框的组合,用来允许用户以和下拉框中的文本没有关系的方式设置或者获取编辑框中的文本。其中 的单行文本域可以是只读的,在这种情况下就和选择控件非常相似了。和选择控件一样,通常列表框是隐藏的,除非用户单击了编辑框旁边的小按钮。这个控件的目 的在提供一种紧凑的方法给用户,使他们既可以自己输入文本,也可以很方便的选择预定义好的文本。
创建一个 ComboBox 的方法和创建选择控件的方法很类似,如下所示:
#include "wx/combobox.h"
wxArrayString strings;
strings.Add(wxT("Apple"));
strings.Add(wxT("Orange"));
strings.Add(wxT("Pear"));
strings.Add(wxT("Grapefruit"));
wxComboBox* combo = new wxComboBox(panel, ID_COMBOBOX,
wxT("Apple"), wxDefaultPosition, wxDefaultSize,
strings, wxCB_DROPDOWN);
wxComboBox 的窗口类型
wxCB_SIMPLE | 列表框永远显示. 仅适用于 Windows 平台。 | \ |
---|---|---|
wxCB_DROPDOWN | 列表框下拉显示。 | |
wxCB_READONLY | 和 wxCB_DROPDOWN 的含义相同,只不过编辑框的文本只能通过列表框进行选择,即使在应用程序的代码里,也不允许编辑框中的文本不存在于列表框内。 | |
wxCB_SORT | 列表框中的选项自动按照子母顺序排序。 |
wxComboBox 的事件
wxComboBox 产生的是 wxCommandEvent 类型的事件,如下表所示:
EVT_TEXT(id, func) | 用来处理 wxEVT_COMMAND_TEXT_UPDATED 事件,当编辑框内文本变化时产生。 |
---|---|
EVT_COMBOBOX(id, func) | 用来处理 wxEVT_COMMAND_COMBOBOX_SELECTED 事件,当用户通过列表框选择一个选项的时候产生。 |
wxComboBox 的成员函数
除了 wxControlWithItems 的成员函数以外,额外的成员函数还包括:
Copy 函数将编辑框中的文本拷贝到剪贴板, Cut 函数除了作 Copy 函数的动作,还将编辑框中的文本清空, Paste 函数则把剪贴板内的文本复制到编辑框中。
GetInsertionPoint 函数返回当前编辑框中插入点的位置(长整型),SetInsertionPoint 则用来设置这个位置.SetInsertionPointEnd 用来将其设置到编辑框末尾。
GetLastPosition 返回编辑框中的最后位置。
GetValue 函数用来返回编辑框中的文本,SetValue 则用来设置它.如果 combobox 拥有 wxCB_READONLY 类型,则参数中的文本必须在列表框内,否则在发表版本中,这条语句将被忽略,而在调试版本中,则会出现一个告警。
SetSelection 用来设置文本框中的一部分为选中状态,Replace 则将文本框中的某一部分由给定的参数取代。Remove 则移除文本框中的给定部分。
请同时参考 wxControlWithItems 类的这些成员函数: Clear, Delete, FindString, GetClientData, GetClientObject, SetClientData, SetClientObject, GetCount, GetSelection, SetSelection, GetString, SetString, GetStringSelection, SetStringSelection, Insert, 和 IsEmpty。
wxCheckBox
CheckBox 是一个通常拥有两种状态:选中或者未选中的控件。通常情况下,如果是选中的状态,则控件上显示一个小的叉号或者对号。通 常这个控件还包含一个标签,这个标签可以显示在控件的左边,也可以显示在控件的右边。CheckBox 控件甚至还可以有第三个状态,姑且称之为混合状态或 者不确定状态。一个典型的用法是在安装程序中,对于某个组件来说除了要安装和不要安装两种状态以后,还可以有必须安装这种状态。
下面是创建 CheckBox 的例子代码:
#include "wx/checkbox.h"
wxCheckBox* checkbox = new wxCheckBox(panel, ID_CHECKBOX,
wxT("&Check me"), wxDefaultPosition, wxDefaultSize);
checkBox->SetValue(true);
以及在 windows 平台上控件的样子:
以及另外的一个三态的 wxCheckBox 第三态的样子:
wxCheckBox 的窗口类型
wxCHK_2STATE | 创建一个二态选择框,这是默认类型。 |
---|---|
wxCHK_3STATE | 创建一个三态选择框。 |
wxCHK_ALLOW_3RD_STATE_FOR_USER | 默认情况下,用户是不能设置第三种状态的,第三种状态只能在程序中通过代码来设置,使用这个类型可使得用户也可以通过鼠标设置第三态。 |
wxALIGN_RIGHT | 使标签显示在选择框的左边。 |
wxCheckBox 的事件
wxCheckBox 产生 wxCommandEvent 类型的事件,如下表所示:
EVT_CHECKBOX(id, func) | 用于处理 wxEVT_COMMAND_CHECKBOX_CLICKED 事件,当 wxCheckBox 的选择状态改变时产生。 |
wxCheckBox 的成员函数
SetLabel 和 GetLabel 用来设置选择框的标签文本. 在 Windows 和 GTK+平台上,可以通过"&"前导字符设置快捷键。
GetValue 和 SetValue 用来操作 Bool 型的当前选择状态. 使用 Get3StateValue 和 Set3StateValue 来操作三种状态 wxCHK_UNCHECKED, wxCHK_CHECKED,或 wxCHK_UNDETERMINED。
Is3State 用于检测是否是三态选择框。
IsChecked 用于检测当前是否为选中状态。
wxListBox 和 wxCheckListBox
wxListBox 用来从一组基于 0 索引的字符串列表中选择一个或者多个。这一组备选的字符串列表显示在一个滚动窗口中,选中的文本被高 亮显示.列表框可以是单选的,这种情况下,如果一个选项被选中,以前被选中的选项就自动变为未选中状态,也可以是多选框,这种状态下,对某个选项的点击只 会导致这个选项的选中状态进行切换。
使用下面的代码创建一个列表框:
#include "wx/listbox.h"
wxArrayString strings;
strings.Add(wxT("First string"));
strings.Add(wxT("Second string"));
strings.Add(wxT("Third string"));
strings.Add(wxT("Fourth string"));
strings.Add(wxT("Fifth string"));
strings.Add(wxT("Sixth string"));
wxListBox* listBox = new wxListBox(panel, ID_LISTBOX,
wxDefaultPosition, wxSize(180, 80), strings, wxLB_SINGLE);
在 windows 下的样子:
wxCheckListBox 是 wxListBox 的派生类,继承了它的功能,另外它还在每个选项上额外显示一个复选框. 这个类包含在头文件 wx/checklst.h 中,下图演示了 wxCheckListBox 控件在 windows 上的样子:
如果有很多选项要显示,你可以考虑使用 wxVListBox。这是一个虚的列表框类,它用来显示每个选项的方法是你在继承自这个类的派生类中实现的 OnDrawItem 函数和 OnMeasureItem 函数,而它的事件映射宏的格式则和 wxListBox 的一模一样。
wxHtmlListBox 就是一个 wxVListBox 的派生类,它提供了显示复杂选项的一种简单的方法。你需要定义一个 wxHtmlListBox 的派生类,然后在其 OnGetItem 函数中,为每个选项定义一段 HTML 文本,然后 wxHtmlListBox 则按照这段 HTML 文本来显示各个选项。下图演示了光盘例子 samples/htlbox 在 Windows Xp 上的效果,在这个例子中,通过重载 OnDrawSeparator 函数实现不同选项的不同显示。
wxListBox 和 wxCheckListBox 的窗口类型
wxLB_SINGLE | 单选列表。 |
---|---|
wxLB_MULTIPLE | 多选列表。 |
wxLB_EXTENDED | 扩展选择选项,用户可以通过 Shift 键或者鼠标以及其它一些键盘绑定进行快速多选。 |
wxLB_HSCROLL | 创建水平滚动条如果选项的值过长. Windows only。 |
wxLB_ALWAYS_SB | 总显示垂直滚动条。 |
wxLB_NEEDED_SB | 只在需要的时候显示垂直滚动条。 |
wxLB_SORT | 所有选项自动按照子母顺序排序。 |
wxListBox 的 wxCheckListBox 事件
wxListBox 和 wxCheckListBox 产生的事件类型 wxCommandEvent 类型的事件。
EVT_LISTBOX(id, func) | 用于处理 wxEVT_COMMAND_LISTBOX_SELECTED 事件,当用户选择某个选项的时候产生。 |
---|---|
EVT_LISTBOX_DCLICK(id, func) | 用于处理 wxEVT_COMMAND_LISTBOX_DOUBLECLICKED 事件,当某个选项被双击的时候产生。 |
EVT_CHECKLISTBOX (id, func) | 用于处理 wxEVT_COMMAND_CHECKLISTBOX_TOGGLED 事件,当 wxCheckListBox 的某个选项的选中状态发生改变的时候产生。 |
wxListBox 成员函数
Deselect 不选则某个选项。 GetSelections 使用 wxArrayInt 类型返回一组选中的索引。 InsertItems 用来插入一组选项,参数可以是个数和 C++的 wxString 数组,以及插入点的组合,也可以是 wxArrayString 对象和插入点的组合。
Selected 用来判断某个选项是否被选中。
Set 用来清除选项并且用参数中的选项组重置选项。参数可以是个数和 C++的 wxString 数组,以及插入点的组合,也可以是 wxArrayString 对象和插入点的组合。
SetFirstItem 将某个选项设置为第一个可见的选项。
SetSelection 和 SetStringSelection 用索引或者字符创值的方式指定某个选项的选中状态。
请同时参考 wxControlWithItems 的下列成员函数: Clear, Delete, FindString, GetClientData, GetClientObject, SetClientData, SetClientObject, GetCount, GetSelection, GetString, SetString, GetStringSelection, Insert, 和 IsEmpty。
wxCheckListBox 的成员函数
除了 wxListBox 的成员函数以外,wxCheckListBox 还另外拥有下面的函数:
Check 函数使用选项索引和一个 bool 值作为参数也控制选项的选中状态。
IsChecked 用来判断某个选项是否为选中状态。
wxRadioBox
Radio Box 用来在一组相关但是互斥的选项中进行选择。通常显示为一个可以拥有一个文本标签的静态框中的一组垂直的或者水平的选项按钮。
这些选项按钮的排列方式取决于构造函数中的两个参数,栏数和方向窗口有关的类型,方向有关的窗口类型包括 wxRA_SPECIFY_COLS(默认值)和 wxRA_SPECIFY_ROWS,举例来说,如果你的 radio box 共有 8 个选项,栏数为 2,方向为 wxRA_SPECIFY_COLS,那么这些选项将会以两列四行的方式显示,而假如方向为 wxRA_SPECIFY_ROWS,则显示为四列两行。
下面演示了怎样创建一个有三栏的 RadioBox:
#include "wx/radiobox.h"
wxArrayString strings;
strings.Add(wxT("&One"));
strings.Add(wxT("&Two"));
strings.Add(wxT("T&hree"));
strings.Add(wxT("&Four "));
strings.Add(wxT("F&ive "));
strings.Add(wxT("&Six "));
wxRadioBox* radioBox = new wxRadioBox(panel, ID_RADIOBOX,
wxT("Radiobox"), wxDefaultPosition, wxDefaultSize,
strings, 3, wxRA_SPECIFY_COLS);
以及它在 windows 系统中的样子:
wxRadioBox 的窗口类型
wxRadioBox 额外的窗口类型如下表所示:
wxRA_SPECIFY_ROWS | 横向分栏。 |
---|---|
wxRA_SPECIFIY_COLS | 纵向分栏。 |
wxRadioBox 事件
wxRadioBox 产生 wxCommandEvent 类型的事件,如下表所示:
EVT_RADIOBOX(id, func) | 用来处理 wxEVT_COMMAND_RADIOBOX_SELECTED 事件,当用户点击选项的时候产生。 |
wxRadioBox 成员函数
Enable 选中(或不选)某个选项。
FindString 查找匹配的选项,返回这个选项的索引或者 wxNOT_FOUND。
GetCount 返回选项的总数。
GetString 和 SetString 用来操作某个选项的标签文本. GetLabel 和 SetLabel 则用来操作整个 radio box 的标签。
GetSelection 返回基于 0 的选中的选项的索引. GetStringSelection 则返回选中的选项的标签文本. SetSelection 和 SetStringSelection 则用来设置对应的选项,通过这两个函数进行设置时不会发送任何事件。
Show 函数用来显示或者隐藏某个特定的选项或者整个 radio box 控件。
wxRadioButton
一个 radio 按钮通常用来表示一组相关但是互斥的选项中的一个,它拥有一个按钮和一个文本标签,这个按钮的外观通常是一个圆形。
radio 按钮有两种状态:选中和未选中。你可以创建一组 radio 按钮来代替前面介绍的 radiobox 控件,这样作的方法是,给第一个 radio 按钮 指定 wxRB_GROUP 类型,然后直到另外一个组被创建,或者没有同级的子控件的时候,这个组才结束,组中的控件既可以是 radio 按钮,也可以是别的 控件。
为什么要代替 radiobox 呢,其中一个原因是有时候你需要使用更复杂的布局,例如,你可能希望给每一个 radio 按钮增加一个额外的描述或者增加一个额外的窗口控件,又或者你不希望在一组 radio 周围显示一个静态的边框等。
下面是创建一组(两个按钮的代码):
#include "wx/radiobut.h"
wxRadioButton* radioButton1 = new wxRadioButton (panel,
ID_RADIOBUTTON1, wxT("&Male"), wxDefaultPosition,
wxDefaultSize, wxRB_GROUP);
radioButton1->SetValue(true);
wxRadioButton* radioButton2 = new wxRadioButton (panel,
ID_RADIOBUTTON2, wxT("&Female"));
//用于水平放置两个按钮的布局控件使用的代码
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(radioButton1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
sizer->Add(radioButton2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
parentSizer->Add(sizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
wxRadioButton 的窗口类型
wxRB_GROUP | 用来标识一组 radio 按钮的开始。 |
---|---|
wxRB_USE_CHECKBOX | 使用 checkbox 的按钮取代 radio 按钮(仅适用于 Palm OS)。 |
wxRadioButton 的事件
wxRadioButton 产生 wxCommandEvent 类型的事件,如下表所示:
EVT_RADIOBUTTON(id, func) | 用于处理 wxEVT_COMMAND_RADIOBUTTON_SELECTED 事件,当用户点击某个 radio 按钮的时候产生。 |
wxRadioButton 的成员函数
GetValue 和 SetValue 使用 bool 类型来操作 radio 按钮的状态。
wxScrollBar
wxScrollBar 用来单独的增加一个滚动条,这个滚动条和某些窗口自动增加的两个滚动条是有区别的,但是它们处理事件的方式是一样的。滚动条主要有下面四个属性:范围(range),滑块大小,页大小和当前位置。
范围的含义指的是和这个滚动条绑定的窗口的逻辑单位的大小。比如一个表格有 15 行,那么和这个表格绑定的滚动条的范围就可以设置为 15。
滑块大小通常用来反映当前可视部分的大小,还用表格来作为例子,如果因为窗口大小的原因表格只能显示 5 行,那么滚动条的滑块大小就可以设置成 5。如果滑块大小大于或者等于范围,在多数平台上,这个滚动条将自动隐藏。
页大小指的是当滚动条执行翻页命令时需要滚动的单位数目。
当前位置指的是滑块当前所处的位置。
使用下面的代码来创建一个滚动条,其中构造函数的参数含义依次为父窗口,标识符,位置,大小和窗口类型:
#include "wx/scrolbar.h"
wxScrollBar* scrollBar = new wxScrollBar(panel, ID_SCROLLBAR,
wxDefaultPosition, wxSize(200, 20), wxSB_HORIZONTAL);
在 windows 平台上,显示结果如下图所示:
创建一个滚动条以后,可以使用 SetScrollbar 函数来设置它的属性。前面在介绍 wxScrolledWindow 的时候已经介绍这个函数的用法。
wxScrollBar 的窗口类型
wxSB_HORIZONTAL | 指定滚动条为水平方向。 |
---|---|
wxSB_VERTICAL | 指定滚动条为垂直方向。 |
wxScrollBar 的事件
wxScrollBar 产生 wxScrollEvent 类型的事件。你可以使用 EVT_COMMAND_SCROLL...事件映射宏加 窗口标识符来拦截由特定滚动条产生的相关事件,或者使用 EVT_SCROLL...不带窗口标识符的事件映射宏来拦截除了本窗口以外来自其他的窗口的滚动 条事件。使用 EVT_SCROLL(func) 可以响应所有的滚动条事件。在附录 I�事件类型和相关宏�中详细列举了所有的滚动事件,你也可以参考手册中 的相关内容。
wxScrollBar 的成员函数
Getrange 返回范围大小。
GetPageSize 返回页大小.通常这个大小和滑块大小相同。
GetThumbPosition 和 SetThumbPosition 用来操作滑块当前位置。
GetThumbLength 返回滑块或者当前可是区域的大小。
SetScrollbar 用来设置滚动条的所有属性.比如滑块位置(逻辑单位),滑块大小,范围,页大小以及一个可选的 bool 参数用来指示是否立即更新滚动条的显示。
wxSpinButton
wxSpinButton 拥有两个小的按钮用来表示上下或者左右.这个控件通常和一个文本编辑框控件一起使用,以用来增加或者减少某个值。为了方便移植, 应该尽可能使用 wxSpinCtrl 来代替 wxSpinButton,因为不是所有的平台都支持 wxSpinButton。
这个控件(以及 wxSpinCtrl)所支持的值的范围是平台相关的,但是至少在-32768 到 32768 之间,
使用下面的代码来创建一个 wxSpinButton,其中构造函数的参数的含义分别为:父窗口,标识符,位置,大小以及窗口类型:
#include "wx/spinbutt.h"
wxSpinButton* spinButton = new wxSpinButton(panel, ID_SPINBUTTON,
wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL);
在 windows 平台上,显示的结果如下图所示:
wxSpinButton 的窗口类型
下表列出了 wxSpinButton 的窗口类型
wxSP_HORIZONTAL | spin 按钮为左右方向. 不支持 wxGTK。 |
---|---|
wxSP_VERTICAL | spin 按钮为上下垂直方向。 |
wxSP_ARROW_KEYS | 用户可以使用方向键来改变相关值。 |
wxSP_WRAP | 将最大值和最小值首尾相连,比如最小值的更小的下一个值将是最大值。 |
wxSpinButton 的事件
wxSpinButton 产生 wxSpinEvent 类型的事件,如下表所示:
EVT_SPIN(id, func) | 用来处理 wxEVT_SCROLL_THUMBTRACK 事件,当上下(或左右)按钮被点击的时候产生。 |
---|---|
EVT_SPIN_UP(id, func) | 用来处理 wxEVT_SCROLL_LINEUP 事件,当向上(或者向左)的按钮被点击的时候产生。 |
EVT_SPIN_DOWN(id, func) | 用来处理 wxEVT_SCROLL_LINEDOWN 事件,当向下(或者向右)按钮被点击的额时候产生。 |
wxSpinButton 的成员函数
GetMax 返回设置的最大值. GetMin 返回设置的最小值. GetValue 和 SetValue 用来操作当前值. SetRange 用来设置最大和最小值。
wxSpinCtrl
wxSpinCtrl 是 wxTextCtrl 和 wxSpinButton 控件的组合。当用户点击 wxSpinButton 的向上或者向下按钮的时候,wxTextCtrl 中的值将会随之变化。用户也可以直接在 wxTextCtrl 中输入他想要的值。
下面的代码用来创建一个值范围在 0 到 100 之间,初始值为 5 的 wxSpinCtrl。
#include "wx/spinctrl.h"
wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_SPINCTRL,
wxT("5"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS,
0, 100, 5);
在 windows 平台上的显示效果如下图所示:
wxSpinCtrl 的窗口类型
wxSP_ARROW_KEYS | 用户可以通过方向键改变相关值。 |
---|---|
wxSP_WRAP | 将最大值和最小值首尾相连。 |
wxSpinCtrl 事件
wxSpinCtrl 产生 wxSpinEvent 类型的事件,如下表所示. 你也可以使用 EVT_TEXT 事件映射宏来处理其文本框的文本更新事件,处理函数的额参数类型为 wxCommandEvent。
EVT_SPIN(id, func) | Handles a wxEVT_SCROLL_THUMBTRACK event, generated whenever the up or down arrow is clicked。 |
---|---|
EVT_SPIN_UP(id, func) | Handles a wxEVT_SCROLL_LINEUP event, generated when the up arrow is clicked。 |
EVT_SPIN_DOWN(id, func) | Handles a wxEVT_SCROLL_LINEDOWN event, generated when the down arrow is clicked。 |
EVT_SPINCTRL(id, func) | Handles all events generated for the wxSpinCtrl。 |
wxSpinCtrl 成员函数
GetMax 返回设置的最大值. GetMin 返回设置的最小值. GetValue 和 SetValue 用来操作当前值. SetRange 用来设置最大值和最小值。
wxSlider
slider 控件拥有一个滑条和一个滑块,可以通过移动滑条上的滑块来改变控件的当前值。
使用下面的代码创建一个取值范围为 0 到 40,初始位置为 16 的 wxSlider。
#include "wx/slider.h"
wxSlider* slider = new wxSlider(panel, ID_SLIDER, 16, 0, 40,
wxDefaultPosition, wxSize(200, -1),
wxSL_HORIZONTAL|wxSL_AUTOTICKS|wxSL_LABELS);
在 windows 平台上显示的外观如下所示:
wxSlider 的窗口类型
wxSL_HORIZONTAL | 显示水平方向的滑条。 |
---|---|
wxSL_VERTICAL | 显示垂直方向的滑条。 |
wxSL_AUTOTICKS | 显示刻度标记。 |
wxSL_LABELS | 显示最大、最小以及当前值的标签。 |
wxSL_LEFT | 对于垂直滑条,将刻度显示在左面。 |
wxSL_RIGHT | 对于垂直滑条,将刻度显示在右面。 |
wxSL_TOP | 对于水平滑条,刻度显示在上面. 默认值为显示在底部。 |
wxSL_SELRANGE | 允许用户通过滑条选择一个范围.仅适用于 Windows。 |
wxSlider 的事件
wxSlider 产生 wxCommandEvent 类型的事件,如下表所示,但是如果你希望更好的控制,你可以使用 EVTCOMMAND_SCROLL...宏,其处理函数的参数类型为 wxScrollEvent,参见附录 I。
EVT_SLIDER(id, func) | 用于处理 wxEVT_COMMAND_SLIDER_UPDATED 事件,当用户移动滑块的时候产生。 |
wxSlider 的成员函数
ClearSel 用来在设置了 wxSL_SELRANGE 类型的滑条上清除选择区域. ClearTicks 则用来清除刻度,仅适用于 windows 系统。
GetLineSize 和 SetLineSize 用来操作移动单位,这个移动单位用来在用户使用方向键操作滑块的时候使用. GetPageSize 和 SetPageSize 也用来操作移动单位,这个单位在用户用鼠标点击滑条的任一边的时候使用。
GetMax 返回当前设置的最大值。
GetMin 返回当前设置的最小值。
GetSelEnd 和 GetSelStart 用来返回选择区域的起点和终点; SetSelection 用来设置选择区域的起点和终点. 这些函数都只适用于 Windows。
GetThumbLength 和 SetThumbLength 用来操作滑块的大小。
GetTickFreq 和 SetTickFreq 用来操作滑条上刻度的密度.SetTick 用来设置刻度的位置。这些函数仅适用于 Windows。
GetValue 返回滑条的当前值, SetValue 用来设置滑条的当前值。
SetRange 用来设置滑条的最大值和最小值。
wxTextCtrl
文本控件是用来显示和编辑文本的控件,它支持单行和多行的文本编辑。在某些平台上,支持给文本控件中的文本设置一些简单的格式和风格。在 windows 平台,GTK+平台以及 Mac OS X 平台上通过使用 wxTextAttr 类来设置和获取文本的当前格式。
使用下面的代码创建一个支持多行文本的文本框控件:
#include "wx/textctrl.h"
wxTextCtrl* textCtrl = new wxTextCtrl(panel, ID_TEXTCTRL,
wxEmptyString, wxDefaultPosition, wxSize(240, 100),
wxTE_MULTILINE);
在 windows 平台上,多行文本框控件的外观如下:
多行文本框允许使用以"\n"分割的一组文本行的方式来处理一段文本,即使在非 Unix 的平台上,使用"\n"作为分割符也是允许的。这使得你可以忽略平 台之间换行符的差异。不过,作为代价,你将不能直接使用那些 GetInsertionPoint 函数或者 GetSelection 函数返回的索引,作为 GetValue 返回的字符串中的索引,因为在前者返回的索引中,操作系统可能会进行了一点点的偏移以便对应上平台使用的"\r\n"换行符,就象 windows 平台上的那样。
如果你想从上面例子的函数的返回值中得到一个子字符串应该怎么办呢?你可以使用 GetRange 函数。它们返回的索引可以被用于它们自 己别的成员函数,比如 SetInsertionPoint 或者 SetSelection。总而言之,不要将用多行文本框的成员函数返回的索引直接用于它的 内容字符串的索引,但是可以将其用于其它成员函数作为参数。
多行文本框支持设置文本格式:你可以为部分文本设置单独的文本颜色和字体。在 windows 平台上,这需要窗口使用 wxTE_RICH 窗口类型。你可以在插入文本之前使用 SetDefaultStyle 函数,或者在插入文本以后使用 SetStyle 来改变已经存在于文本框中的文本的格 式。前者更有效率。
无论在哪种情况下,如果指定的格式中的部分格式是没有被指定的,则默认格式中相应的值将被使用,如果没有默认的格式,那个文本控件自己的属性将会被使用。
在下面的代码中,第二次调用 SetDefaultStyle 不会改变文本的前景颜色(仍然是红色),最后一次调用 SetDefaultStyle 则不会改变文本的背景颜色(仍然是灰色的)。
text->SetDefaultStyle(wxTextAttr(*wxRED));
text->AppendText(wxT("Red text\n"));
text->SetDefaultStyle(wxTextAttr(wxNullColour, *wxLIGHT_GREY));
text->AppendText(wxT("Red on gray text\n"));
text->SetDefaultStyle(wxTextAttr(*wxBLUE));
text->AppendText(wxT("Blue on gray text\n"));
wxTextCtrl 的窗口类型
wxTE_PROCESS_ENTER | 这个控件将会产生 wxEVT_COMMAND_TEXT_ENTER 事件.如果没有设置这个类型,回车键将会或者被空家内部处理,或者被 dialog 窗口用来遍历所有子窗口。 |
---|---|
wxTE_PROCESS_TAB | 这个控件将会在 TAB 键被按下的时候处理 wxEVT_CHAR 事件,否则 TAB 键用来在 dialog 的所有子窗口之间遍历。 |
wxTE_MULTILINE | 支持多行文本。 |
wxTE_PASSWORD | 文本将会以"*"显示。 |
wxTE_READONLY | 文本只读。 |
wxTE_RICH | 在 Windows 下使用富文本编辑控件. 这将允许控件存储超过 64KB 的文本;并且垂直滚动条自动在需要的时候显示.这个类型在别的平台上将被忽略。 |
wxTE_RICH2 | 在 Windows 下使用富文本编辑控件的 2.0 或者 3.0 版本; 垂直滚动条将始终被显示. 在其它平台忽略这个类型。 |
wxTE_AUTO_URL | 高亮显示 URL 字符串,并且在其被点击的时候产生 wxTextUrlEvents 事件. 在 windows 平台上需要设置 wxTE_RICH 类型.仅适用于 Windows 和 GTK+平台。 |
wxTE_NOHIDESEL | 默认情况下,在 windows 平台上,如果文本框当前没有得到焦点,将不会高亮显示文本框中文本的选中部分,使用这个类型可以使其即使在文本框没有获得焦点的时候,被选部分也会高亮显示。其它平台则忽略这个类型。 |
wxHSCROLL | 显示水平滚动条,这样就不需要文本自动换行了. 在 GTK+平台上无效。 |
wxTE_LEFT | 文本框中的文本左对齐 (默认)。 |
wxTE_CENTRE | 文本框中的文本居中对齐。 |
wxTE_RIGHT | 文本框中的文本右对齐。 |
wxTE_DONTWRAP | 等同于 wxHSCROLL 类型。 |
wxTE_LINEWRAP | 如果文本行的长度超出可以显示的部分,则允许在文本行的任何位置换行,目前只支持 wxUniversal 版本。 |
wxTE_WORDWRAP | 如果文本行的长度超出可以显示的部分,则允许在文本行的单词边界位置换行,目前只支持 wxUniversal 版本。 |
wxTE_NO_VSCROLL | Removes the vertical scrollbar. No effect on GTK+。 |
wxTextCtrl 的事件
wxTextCtrl 主要产生 wxCommandEvent 类型的事件,如下表所示:
EVT_TEXT(id, func) | 用于处理 wxEVT_COMMAND_TEXT_UPDATED 事件,文本框内文本值改变的时候产生。 |
---|---|
EVT_TEXT_ENTER(id, func) | 用于处理 wxEVT_COMMAND_TEXT_ENTER 事件,在用户按下回车键的时候产生并且文本框设置了 wxTE_PROCESS_ENTER 窗口类型。 |
EVT_TEXT_MAXLEN(id, func) | 用于处理 wxEVT_COMMAND_TEXT_MAXLEN 事件,当用户试图输入的文本长度超过 SetMaxLength 设置的长度的时候产生.仅适用于 Windows 和 GTK+平台。 |
wxTextCtrl 的成员函数
AppendText 将文本添加在文本框最后, WriteText 在当前的插入点插入文本. SetValue 清除文本框中的当前文本然后赋值,赋值后 IsModified 函数返回 False.在所有这些函数中,如果文本框支持多行文本,则可以使 用换行符。需要注意这些函数都会产生文本更新事件。
GetValue 函数返回文本框的所有文本,如果是多行文本类型,则其中可以包含换行符. GetLineText 返回其中一行. GetRange 返回某个位置范围内的文本。
Copy 函数拷贝选中的文本到剪贴板. Cut 除了 Copy 以外还清除选中的文本. Paste 则将剪贴板上的文本替换当前的选中文本,在用户界面刷新事件处理函数中,你还可以使用 CanCopy, CanCut 和 CanPaste 函数。
Clear 清除所有文本.产生文本更新事件。
DiscardEdits 复位内部的�已修改�标记,就好像文本框的文本已经被保存了那样。
EmulateKeyPress 用来模拟按键输入,以便在文本框中进行某些修改。
GetdefaultStyle 和 SetDefaultStyle 用来操作当前的默认文本格式. GetStyle 返回某个位置文本的当前格式,SetStyle 则用来设置某个范围内的文本格式 e。
GetInsertionPoint 和 SetInsertionPoint 函数用来操作新文本的插入点. GetLastPosition 用来返回当前文本的最末位置,SetInsertionPointEnd 用来将插入点设置在文本最末。
GetLineLength 返回某个特定行的字符创长度。
GetNumberOfLines 返回总行数。
GetStringSelection 返回当前选中的文本。如果当前没有选中任何文本,则返回空字符串。GetSelection 返回当前选中部分的索引. SetSelection 则用两个整数参数来设置当前的选中部分。
IsEditable 返回当前控件是否可以被编辑. SetEditable 用来设置控件的可编辑状态以便让其只读或者可编辑. IsModified 当文本框内的文本已经被编辑过的时候返回 True. IsMultiline 用来检测当前文本框是否是多行文本框。
LoadFile 将文件内容读入文本框, SaveFile 将文本框内容存入文件。
PositionToXY 将象素值转换成文本的行号和位置,而 XYToPosition 则刚好相反。
Remove 删除给定区域的文本,. Replace 则替换给定区域的文本。
ShowPosition 使得文本控件显示包含给定位置的部分。
Undo 撤消最近一次编辑, Redo 重复最近一次编辑. 在某些平台上,这些操作可能什么也不作. 你可以用 CanUndo 和 CanRedo 来测试当前的平台是否支持撤消和重做动作。
wxToggleButton
wxToggleButton 在用户点击以后保持按下状态.换句话说,除了长的象按钮,它其实更可以说是一个 wxCheckBox。
创建 wxToggleButton 的代码如下:
#include "wx/tglbtn.h"
wxToggleButton* toggleButton = new wxToggleButton(panel, ID_TOGGLE,
wxT("&Toggle label"), wxDefaultPosition, wxDefaultSize);
toggleButton->SetValue(true);
下图则显示了其在 windows 平台上的样子:
wxToggleButton 的窗口类型
wxToggleButton 没有特别的窗口类型。
wxToggleButton 事件
wxToggleButton 产生 wxCommandEvent 类型的事件。
EVT_TOGGLEBUTTON(id, func) | 用于处理 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED 事件,用户点击该按钮的时候产生。 |
wxToggleButton 的成员函数
SetLabel 和 GetLabel 用来操作按钮上的标签. 在 windows 和 GTK+平台上你可以使用"&"前导符来指定一个加速键。
GetValue 和 SetValue 用来获取和设置按钮的状态。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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