4.3 基础窗口类
虽然你不一定有机会直接使用基础窗口类(wxWindow),但是由于这个类是很多窗口控件的基类,它实现的很多方法在它的子类型中都可以直接拿来使用,所以有必要介绍一下这个基础窗口类。
窗口类 wxWindow
wxWindow 窗口类既是一个重要的基类,也是一个你可以直接在代码中使用的类。当然,前者使用的频度要比后者大很多。
和前面提到的一样,wxWindow 也可以使用单步创建或者两步创建两种方式。单步创建的构造函数原型如下:
wxWindow(wxWindow* parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxT("panel"));
可以象下面这样使用:
wxWindow* win = new wxWindow(parent, wxID_ANY,
wxPoint(100, 100), wxSize(200, 200));
窗口类型
每一个窗口类都可以使用定义在下表中的这些窗口基类中的窗口类型。这些类型中不是所有的类些都被所有的控件所支持。例如对于边框的类型。如果在创建窗口的时候你没有指定窗口的边框类型,那么在不同的平台上将会有不同的边框类型的缺省值。在 windows 平台上,控件边框的缺省值为 wxSUNKEN_BORDER,意为使用当前系统风格的边框。你可以使用类似 wxNO_BORDER 这样的值来覆盖系统的默认值。
wxSIMPLE_BORDER | 在窗口周围显示一个瘦边框。 |
---|---|
wxDOUBLE_BORDER | 显示一个双层边框。 |
wxSUNKEN_BORDER | 显示一个凹陷的边框,或者使用当前窗口风格设置。 |
wxRAISED_BORDER | 显示一个凸起的边框。 |
wxSTATIC_BORDER | 显示一个适合静态控件的边框. 只支持 Windows 平台。 |
wxNO_BORDER | 不显示任何边框。 |
wxTRANSPARENT_WINDOW | 定义一个透明窗口 (意思是这个窗口不接收 paint 事件).只支持 windows 平台。 |
wxTAB_TRAVERSAL | 使用这个类型允许非 Dialog 窗口支持使用 TAB 进行遍历。 |
wxWANTS_CHARS | 使用这个类型来允许窗口接收包括回车和 TAB 在内的所有的键盘事件。TAB 用来在 Dialog 类型的窗口中遍历各控件。如果没有设置这个类型,这些特殊的按键事件将不会被产生。 |
wxFULL_REPAINT_ON_RESIZE | 在默认情况下,在窗口客户区大小发生改变时,wxWidgets 并不会重画整个客户区。设置这个类型将使得 wxWidgets 改变这种默认的作法,而保持整个客户区的刷新 |
wxVSCROLL | 显示垂直滚动条。 |
wxHSCROLL | 显示水平滚动条。 |
wxALWAYS_SHOW_SB | 如果一个窗口有滚动条,那么在不需要滚动条的时候(当窗口足够大不需要使用滚动条的时候),禁止滚条而不隐藏滚动条。这个类型目前只支持 Windows 平台和 wxWidgets 的 wxUniversal 版本。 |
wxCLIP_CHILDREN | 只支持 Windows 平台,用于消除由于擦除子窗口的背景而引起的闪铄。 |
下表列出了窗口的扩展类型,这些扩展类型不能直接和类型混用,而要使用 wxWindow::SetExtraStyle 函数来进行设置。
wxWS_EX_VALIDATE_RECURSIVELY | 在默认情况下,Validate,transferDataToWindow,和 transferDataFromWindow 只在窗口的直接子窗口上才可以使用。如果设置了这个扩展类型,那么将可以递归的在各个子窗口上使用。 |
---|---|
wxWS_EX_BLOCK_EVENTS | wxCommandEvents 事件将会在无法在当前事件表中找到匹配的时候在其父窗口中尝试匹配,设置这个扩展属性可以阻止这个行为。Dialog 类型的窗口默认设置了这个类型,但是如果 SetExtraStyle 被应用程序类调用过的话,默认设置可能被覆盖。 |
wxWS_EX_TRANSIENT | 不要使用这个窗口作为其它窗口的父窗口.这个类型一定只能用于瞬间窗口;否则,如果使用它作为一个 dialog 或者 frame 类型窗口的父窗口,如果父窗口在子窗口之前释放,可能导致系统崩溃。 |
wxWS_EX_PROCESS_IDLE | 这个窗口应该处理所有的 idle 事件,包括那些设置了 wxIDLE_PROCESS_SPECIFIED 模式的 idle 事件。 |
wxWS_EX_PROCESS_UI_UPDATES | 这个窗口将处理所有的 Ui 刷新事件,包括那些设置了 wxUPDATE_UI_PROCESS_SPECIFIED 的 UI 刷新事件。参考第 9 章获得和界面刷新有关的更多的内容。 |
窗口事件
窗口类和它的派生类可以产生下面的事件(鼠标,键盘和游戏手柄产生的事件将会在第 6 章描述)。
EVT_WINDOW_CREATE(func) | 用于处理 wxEVT_CREATE 事件,这个事件在窗口刚刚被产生的时候生成,处理函数的参数类型是 wxWindowCreateEvent。 |
---|---|
EVT_WINDOW_DESTROY(func) | 用于处理 wxEVT_DELETE 事件,在这个窗口即将被删除的时候产生,处理函数的参数类型是 wxWindowDestroyEvent。 |
EVT_PAINT(func) | 用于处理 wxEVT_PAINT 事件,在窗口需要被刷新的时候产生.处理函数的参数类型是 wxPaintEvent。 |
EVT_ERASE_BACKGROUND(func) | 用于处理 wxEVT_ERASE_BACKGROUND 事件,在窗口背景需要被更新的时候产生. 处理函数的参数是 wxEraseEvent。 |
EVT_MOVE(func) | 用于处理 wxEVT_MOVE 事件,在窗口移动的时候产生.处理函数的参数类型是 wxMoveEvent。 |
EVT_SIZE(func) | 用于处理 wxEVT_SIZE 事件,在窗口大小发生变化以后产生.处理函数的参数类型是 wxSizeEvent。 |
EVT_SET_FOCUS(func)EVT_KILL_FOCUS(func) | 用于处理 wxEVT_SET_FOCUS 和 wxEVT_KILL_FOCUS 事件,在窗口得到或者失去键盘焦点的时候产生. 处理函数参数类型是 wxFocusEvent。 |
EVT_SYS_COLOUR_CHANGED(func) | 用于处理 wxEVT_SYS_COLOUR_CHANGED 事件,当用户在控制面板里更改了系统颜色的时候产生(只支持 windows 平台). 处理函数参数类型为 wxSysColourChangedEvent。 |
EVT_IDLE(func) | 用于处理 wxEVT_IDLE 事件,在空闲事件产生.处理函数参数类型位 wxIdleEvent。 |
EVT_UPDATE_UI(func) | 用于处理 wxEVT_UPDATE_UI 事件,在系统空闲时间产生用来给窗口一个更新自己的机会。 |
wxWindow 类的成员函数
因为 wxWindow 类是其它所有窗口类的基类,它拥有很多的成员函数。我们不可能在这里作一一的说明,只能拣其中最重要的一些作简要的说明。不过我们还是推荐你浏览一下 wxWidgets 手册中的相关部分,以便能够彻底了解 wxWindow 类提供的所有功能,以及要使用这个功能你需要提供的参数等。
CaptureMouse 函数可以捕获所有的鼠标输入(将其限制在本窗口以内),ReleaseMouse 则可以释放前一次的捕获.在绘图程序中,这两个函数是很有用的。它可以让你在鼠标移动到窗口边缘的时候来滚动窗口的客户区,而不是任由鼠标跑到别的窗口并且激活别的窗口。另外的两个函数 GetCapture 用来获取当前正在使用的捕获设备(如果是被当前的应用程序设置的话),而 HasCapture 可以用来检测是否鼠标正被这个窗口捕获。
Centre, CentreOnParent 和 CentreOnScreen 三个函数可以让窗口调整自己的位置使其位于屏幕或者是其父窗口的正中间位置。
ClearBackground 函数将使用当前的背景色清除当前窗口。
ClientToScreen 和 ScreenToClient 可以将座标在相对于屏幕左上角和相对于客户区左上角之间进行互相转换。
Close 函数产生一个 wxCloseEvent 事件,这个事件通常的处理过程将关闭窗口,释放内存。当然如果应用程序为这个事件定义了特殊的处理函数,那么窗口也有可能不被关闭和释放。
ConvertDialogToPixels 和 ConvertPixelsToDialog 函数可以对数值进行对话框单位和象素单位之间的转换。这在基于字体大小以便应用程序的显示更合理的操作中是很有用的。
Destroy 函数将安全的释放窗口.使用这个函数代替直接调用 delete 操作符因为这个函数下不同的窗口类型的表现是不一样的。对于对话框和 frame 这样的顶层窗口来说,这个函数会将窗口放入一个等待删除的额窗口列表中,等到这个窗口的所有的事件都处理完毕的时候才会被删除,这可以避免一些事件在已经不存在的窗口上被执行。
Enable 允许或者禁止窗口和它的子窗口处理输入事件。在禁止状态下一些窗口会有不同的颜色和外观。Disable 函数和 Enable 函数使用 false 作为参数的效果是完全一样的。
FindFocus 函数是一个静态函数,用它可以找到当前拥有键盘焦点的窗口。
FindWindow 函数可以通过标识符或者名字在它的窗口关系树中寻找某个窗口. 返回值可能是它的一个子窗口或者它自己.如果你可以确定你要找的窗口的类型,可以安全的使用 wxDynamicCast 进行类型强制转换,转换的结果将是一个指向那个类型的指针或者是 NULL:
MyWindow* window = wxDynamicCast(FindWindow(ID_MYWINDOW), MyWindow);
Fit 函数会自动改变窗口的大小以便刚好可以容纳它的所有子窗口.这个函数应用被应用在使用基于 sizer 的布局的时候。FitInside 函数是一个类似的函数,区别在于它使用的是虚大小(应用在那些包含滚动条的窗口)。
Freeze 和 Thaw,这两个函数的作用是告诉 wxWidgets,在这两个函数之间进行的刷新界面的操作是允许被优化的。举例来说,如果你要在一个文本框控件逐行中加入多行文本,则可以用这个方法来优化显示效果,避免闪烁,这两个函数已经在 GTK+版本的 wxTextCtrl 控件上实现,也适用于 Windows 和 Max Os X 平台的所有类。
GetAcceleratorTable 和 SetAcceleratorTable 用来获取和设置某个窗口的加速键表。
GetBackgroundColour 和 SetBackgroundColour 用来访问窗口的背景颜色属性。这个属性被 wxEVT_ERASE_BACKGROUND 事件用来绘制窗口背景.如果你更改了背景颜色设置,你应该调用 Refresh 或者 ClearBackground 函数来刷新背景. SetOwnBackgroundColour 的作用和 SetBackgroundColour 基本相同,但是前者不会更改当前窗口的子窗口的背景属性。
GetBackgroundStyle 和 SetBackgroundStyle 用来设置窗口的背景类型. 默认的窗口背景类型是 wxBG_STYLE_SYSTEM,它的含义是 wxWidgets 按照系统默认设置来进行背景绘制。系统默认的背景绘制方法根据控件的不同而不同,比如 wxDialog 的默认背景绘制方法是什么纹理绘制的方法,而 wxListBox 则是使用固定颜色的绘制方法。如果你设置了窗口的背景绘制方法类型是 wxBG_STYLE_COLOUR,那么 wxWidgets 会全部用单一颜色的方法绘制背景。而如果你将其设置为 wxBG_STYLE_CUSTOM, wxWidgets 将不进行任何的背景绘制工作,你可以自己在擦除背景事件中或者重画事件中自己绘制背景.如果你希望自己绘制背景,请一定设置 wxBG_STYLE_CUSTOM 为背景类型,否则很容易引起画面的闪烁。
GetBestSize 函数以象素为单位返回窗口最合适的大小(因为每个窗口类都需要实现 DoGetBestSize 函数).这个函数用来提示 Sizer 系统不要让这个窗口的尺寸太小以致不能正确的显示和使用。举例来说,对于静态文本控件来说,不要让它的字符只能显示一半。对于包含其它子窗口的窗口比如 wxPanel 来说,这个尺寸等于对这个窗口调用 Fit 函数以后的尺寸的大小。
GetCaret 和 SetCaret 函数用来访问或者设置窗口的光标。
GetClientSize 和 SetClientSize 用来访问和设置窗口的客户区大小,单位是象素. 客户区大小指的是不包括边框和修饰的区域,或者说你用户可以绘制或者用来放置子窗口的区域。
GetCursor 和 SetCursor 函数用来访问和设置窗口的鼠标指针。
GetDefaultItem 函数返回一个指向这个窗口默认的子按钮的指针或者返回 NULL。默认子按钮是当用户按回车键的时候默认激活的按钮,可以通过 wxButton::SetDefault 函数进行设置。
GetDropTarget 和 SetDropTarget 函数用来取得或者设置和窗口关联的 wxDropTarget 对象,这个对象用来处理和控制窗口的拖放操作. 我们将在第 11 章"剪贴板和拖放"中详细介绍拖放有关的操作。
GetEventHandler 和 SetEventHandler 函数用来访问和设置窗口的第一事件表.默认情况下,窗口的事件表就是窗口自己,但是你可以指定不同的事件表,也可以通过 PushEventHandler 和 PopEventHandler 函数设置一个事件表链。然后让不同的事件表处理不同的事件. wxWidgets 将搜索整个事件表链来寻找匹配的事件处理函数处理新收到的事件,详情请参阅第 3 章,“事件处理”。
GetExtraStyle 和 SetExtraStyle 函数用来获取和设置窗口的扩展类型位。扩展类型宏通常以 wxWSEX开头。
GetFont 和 SetFont 函数获取和设置和窗口相关的字体. SetOwnFont 和 SetFont 的功能相似,唯一的区别在于前者设置的字体不会被子窗口继承。
GetForegroundColour 和 SetForegroundColour 函数用来操作窗口的前景颜色属性. 和 SetOwnForegroundColour 函数的区别仅在于是否改变子窗口的这个属性。
GetHelpText 和 SetHelpText 用来获取和设置窗口相关的上下文帮助.这个文本属性实际上存储在当前的 wxHelpProvider 实现中,而不是存在于窗口类中。
GetId 和 SetId 用来操作窗口标识符。
GetLabel 函数返回窗口相关联的标签.具体的含义取决的特定的窗口类。
GetName 和 SetName 用来操作窗口名称,这个名字不需要是唯一的。这个名称对 wxWidgets 来说没有什么意义,但是在 Motif 系统中被用于窗口资源的名称。
GetParent 返回窗口的父窗口。
GetPosition 以象素单位返回相对于父窗口的窗口左上角座标。
GetRect 返回一个 wxRect 对象 (参考第 13 章, "数据结构和类型"),其中包含了象素单位的这个窗口的大小和位置信息。
GetSize 和 SetSize 函数获取和设置窗口象素单位的窗口长宽。
GetSizer 和 SetSizer 函数用来操作这个窗口绑定的最顶级的窗口布局对象。
GetTextExtent 用于返回当前字体下某个字符串的象素长度。
GetToolTip 和 SetToolTip 用来操作这个窗口的 tooltip 对象。
GetUpdateRegion 函数返回窗口自上次 Paint 事件以来需要刷新的区域。
GetValidator 和 SetValidator 函数用来操作这个窗口可选的 wxValidator 对象。详情请参考第 9 章。
GetVirtualSize 返回窗口的虚大小,通常就是和滚动条绑定的那个大小。
GetWindowStyle 和 SetWindowStyle 用来操作窗口类型比特位。
InitDialog 函数发送一个 wxEVT_INIT_DIALOG 事件来来开始对话框数据传送。
IsEnabled 用来检测当前窗口的使能状态。
IsExposed 用来检测一个点或者一个矩形区域是否位于需要刷新的范围。
IsShown 用来指示窗口是否可见。
IsTopLevel 用来指示窗口是否是顶层窗口(仅用于 wxFrame 或者 wxDialog)。
Layout 函数用来在窗口已经指定一个布局对象的情况下更新窗口布局。参考第 7 章。
Lower 函数用来将窗口移到窗口树的最低层,而 Raise 则把窗口移动到窗口树的最顶层.这两个函数既可以用于顶层窗口,也可以用于子窗口。
MakeModal 函数禁用其它所有的顶层窗口,以便用户只能和当前这个顶层窗口交互。
Move 函数用来移动窗口。
MoveAfterInTabOrder 更改窗口的 TAB 顺序到作为参数的窗口的后面,而 MoveBeforeInTabOrder 则将其挪到参数窗口的前面。
PushEventHandler 压入一个事件表到当前的事件表栈, PopEventHandler 函数弹出并且返回事件表栈最顶层的事件表. RemoveEventHandler 则查找事件表栈中的一个事件表并且将其出栈。
PopupMenu 函数在某个位置弹出一个菜单。
Refresh 和 RefreshRect 函数导致窗口收到一个重画事件(和一个可选的擦除背景事件)。
SetFocus 函数让本窗口收到键盘焦点。
SetScrollbar 函数用来设置窗口内建的滚动条的属性。
SetSizeHints 函数用来定义窗口的最小最大尺寸,依次窗口尺寸增量的大小,仅对顶层窗口适用。
Show 函数用来显示和隐藏窗口; Hide 函数的作用相当于适用 false 作为参数调用 Show 函数。
transferDataFromWindow 和 transferDataToWindow 获取和传输数据到窗口对象,并且在没有被重载的情况下会调用验证函数。
Update 立即重画窗口已经过期的区域。
UpdateWindowUI 函数发送 wxUpdateUIEvents 事件到窗口,以便给窗口一个更新窗口元素(比如工具条和菜单)的机会。
Validate 使用当前的验证对象验证窗口数据。
wxControl 类
wxControl 是一个虚类。它继承自 wxWindow,用来作为控件的基类: 所谓控件指的是那些可以显示数据项并且通常需要响应鼠标或者键盘事件的那些窗口类。
wxControlWithItems 类
wxControlWithItems 也是一个虚类,用来作为 wxWidgets 的一些包含多个数据项的控件(比如 wxListBox, wxCheckListBox,wxChoice 和 wxComboBox 等)的基类。使用这个基类的目的为了给这些具有相似功能的控件提供一致的 API 函数。
wxControlWithItems 的数据项拥有一个字符串和一个和这个字符串绑定的可选的客户数据。客户数据可以是两种类型,要么是无类型指针(void*),这意味这这个控件只帮忙存储客户数据但是永远不会使用客户数据。另外一种是有类型(wxClientData)指针,对于后一种情况,客户数据会在控件被释放或者数据项被清除的时候被自动释放。同一个控件的所有数据项必须拥有同样的客户区数据类型:要么是前者,要么是后者。客户区数据的类型是在第一次调用 Append 函数或者,SetClientData 函数或者 SetClientObject 函数的时候被确定的。如果要使用有类型指针客户数据,你应该自定义一个继承自 wxClientData 的类,然后将它的实例指针传递给 Append 函数或者 SetClientObject 函数。
wxControlWithItems 的成员函数
Append 函数给这个控件增加一个或者一组数据项. 如果是增加一个数据项,你可以用第二个参数指定有类型客户数据指针或者无类型客户数据指针。比如:
wxArrayString strArr;
strArr.Add(wxT("First string"));
strArr.Add(wxT("Second string"));
controlA->Append(strArr);
controlA->Append(wxT("Third string"));
controlB->Append(wxT("First string"), (void *) myPtr);
controlC->Append(wxT("First string"), new MyTypedData(1));
Clear 函数清除控件所有数据项并且清除所有的客户数据。
Delete 函数使用基于 0 的索引清除一个数据项以及它的客户数据。
FindString 返回一个和某个字符串基于 0 的数据项的索引。如果找不到则返回 wxNOT_FOUND。
GetClientData 和 GetClientObject 返回某个数据项的客户区数据指针(如果有的话). SetClientData 和 SetClientObject 则可以用来设置这个指针。
GetCount 数据项的总数。
GetSelection 返回选中的数据项或 wxNOT_FOUND. SetSelection 则用来设置某个数据项为选中状态。
GetString 用来获取某个数据项的字符串; SetString 则用来设置它。
GetStringSelection 用来返回选中的数据项的字符串或者一个空的字符串; SetStringSelection 则用来设置选中的字符串。你应该先调用 FindString 函数保证这个字符串是存在于某个数据项的,否则可能引发断言失败。
Insert 在控件数据项的某个位置插入一个数据项(可以包含也可以不包含客户数据)。
IsEmpty 则用来检测一个控件的数据项是否为空。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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