ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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系统上的默认外观: ![](img/mhtCB59%281%29.tmp) 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平台上的显示效果: ![](img/mhtCB6C%281%29.tmp) 图片按钮通常只需要指定一个拥有透明背景的图片,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窗口的只读属性来模拟选择控件,以便能够使得在选项过多的时候使用滚动条。 ![](img/mhtCB6F%281%29.tmp) 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平台上控件的样子: ![](img/mhtCB81%281%29.tmp) 以及另外的一个三态的wxCheckBox第三态的样子: ![](img/mhtCB84%281%29.tmp) 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下的样子: ![](img/mhtCB87%281%29.tmp) wxCheckListBox是wxListBox的派生类,继承了它的功能,另外它还在每个选项上额外显示一个复选框. 这个类包含在头文件wx/checklst.h中,下图演示了wxCheckListBox控件在windows上的样子: ![](img/mhtCB9A%281%29.tmp) 如果有很多选项要显示,你可以考虑使用wxVListBox。这是一个虚的列表框类,它用来显示每个选项的方法是你在继承自这个类的派生类中实现的OnDrawItem函数和OnMeasureItem函数,而它的事件映射宏的格式则和wxListBox的一模一样。 wxHtmlListBox就是一个wxVListBox的派生类,它提供了显示复杂选项的一种简单的方法。你需要定义一个 wxHtmlListBox的派生类,然后在其OnGetItem函数中,为每个选项定义一段HTML文本,然后wxHtmlListBox则按照这段 HTML文本来显示各个选项。下图演示了光盘例子samples/htlbox在Windows Xp上的效果,在这个例子中,通过重载OnDrawSeparator函数实现不同选项的不同显示。 ![](img/mhtCB9D%281%29.tmp) 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系统中的样子: ![](img/mhtCBB0%281%29.tmp) 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周围显示一个静态的边框等。 ![](img/mhtCBB3%281%29.tmp) 下面是创建一组(两个按钮的代码): ``` #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平台上,显示结果如下图所示: ![](img/mhtCBB6%281%29.tmp) 创建一个滚动条以后,可以使用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平台上,显示的结果如下图所示: ![](img/mhtCBC8%281%29.tmp) 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平台上的显示效果如下图所示: ![](img/mhtCBCB%281%29.tmp) 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平台上显示的外观如下所示: ![](img/mhtCBCE%281%29.tmp) wxSlider的窗口类型 | wxSL_HORIZONTAL | 显示水平方向的滑条. | |:--- |:--- | | wxSL_VERTICAL | 显示垂直方向的滑条. | | wxSL_AUTOTICKS | 显示刻度标记. | | wxSL_LABELS | 显示最大、最小以及当前值的标签. | | wxSL_LEFT | 对于垂直滑条,将刻度显示在左面. | | wxSL_RIGHT | 对于垂直滑条,将刻度显示在右面. | | wxSL_TOP | 对于水平滑条,刻度显示在上面. 默认值为显示在底部. | | wxSL_SELRANGE | 允许用户通过滑条选择一个范围.仅适用于Windows. | wxSlider的事件 wxSlider产生wxCommandEvent类型的事件,如下表所示,但是如果你希望更好的控制,你可以使用EVT_COMMAND_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平台上,多行文本框控件的外观如下: ![](img/mhtCBE1%281%29.tmp) 多行文本框允许使用以"\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平台上的样子: ![](img/mhtCBE4%281%29.tmp) wxToggleButton的窗口类型 wxToggleButton没有特别的窗口类型. wxToggleButton事件 wxToggleButton产生wxCommandEvent类型的事件。 | | | | --- | --- | | EVT_TOGGLEBUTTON(id, func) | 用于处理wxEVT_COMMAND_TOGGLEBUTTON_CLICKED事件, 用户点击该按钮的时候产生. | wxToggleButton的成员函数 SetLabel和GetLabel用来操作按钮上的标签. 在windows和GTK+平台上你可以使用"&"前导符来指定一个加速键. GetValue和SetValue用来获取和设置按钮的状态。