3.3 过滤某个事件

wxWidgets事件处理系统实现了一些和C++中的虚方法非常类似的机制,通过这种机制,你可以通过重载某种基类的事件表的方法来改变基类的默认的事件处理过程。在多数情况下,通过这种方法,你甚至可以改变本地原生控件的默认行为。举例来说,你可以过滤某些按键事件以便本地原生的编辑框控件不处理这些按键。要达到这个目的,你需要实现一个继承自wxTextCtrl的新的类,然后在其事件表中使用EVT_KEY_DOWN事件映射宏。过滤所有的按键事件也许不是你想要的,这时候,你可以通过调用wxEvent::Skip函数来提示事件处理过程对于其中的某些按键事件应该继续寻找其父类的事件表。

总的来说,在wxWidgets中,你应该通过调用事件的Skip方法,而不是通过显式直接调用其父类对应函数的方法来实现对特殊事件的过滤。

下面的这个例子演示怎样让你自己的文本框控件只接受"a"到"z"和"A"到"Z"的按键,而忽略其它按键的方法:

void MyTextCtrl::OnChar(wxKeyEvent& event)
{
    if ( wxIsalpha( event.KeyCode() ) )
    {
       //这些按键在可以接受的范围,所以按照正常的流程处理
       event.Skip();
    }
    else
    {
       // 这些事件不在我们可以接受的范围,所以我们不调用Skip函数
       // 由于事件表已经匹配并且没有调用Skip函数,所以事件处理过程不会
       // 再继续匹配别的事件表,而是认为事件处理已经结束
       wxBell();
    }
}