每个类处理程序的wxTextCtrl重写每个实例处理程序

时间:2016-03-11 05:13:40

标签: wxwidgets wxtextctrl

wxWidgets 3.0.2,MSVC 2013。

这个问题的实质是:如何覆盖wxTextCtrl上的默认文件丢弃处理程序?有一个我需要覆盖的超类安装的默认处理程序。

我正在尝试创建一个接受文件丢弃事件的wxWidgets文本区域。我在文档中找不到文件丢弃的每类事件,所以我回过头来复制示例代码,手动Connect是构造函数中的处理程序。这是我的班级定义。

struct BitsTextCtrl : public wxTextCtrl {
    AsmFrame *m_frame;

    BitsTextCtrl(AsmFrame *frame, wxPanel *parent);
    void onMouseEvent(wxMouseEvent& evt) { evt.Skip(); /* for now */ }
    void onDropFiles(wxDropFilesEvent &evt); // my target to setup in the constructor

    wxDECLARE_EVENT_TABLE();
};

实现如下所示。 构造函数为此实例设置文件放置处理程序(非常类似于示例)。

BitsTextCtrl::BitsTextCtrl(AsmFrame *frame, wxPanel *parent)
    : wxTextCtrl(parent,
        wxID_ANY, wxT(""),
        wxDefaultPosition, wxSize(DFT_W/2,3*DFT_H/4),
        wxTE_RICH2 | wxTE_MULTILINE | wxTE_DONTWRAP | wxTE_PROCESS_TAB | wxHSCROLL)
{
    SetFont(wxFont(12, wxTELETYPE, wxNORMAL, wxNORMAL));
    SetBackgroundColour(wxColor(0xffeeeeeeUL));
    DragAcceptFiles(true);
    Connect(
        wxEVT_DROP_FILES,
        wxDropFilesEventHandler(BitsTextCtrl::onDropFiles),
        NULL, this);
}

void BitsTextCtrl::onDropFiles(wxDropFilesEvent &evt) {
    if (evt.GetNumberOfFiles() == 1) {
       wxString* dropped = evt.GetFiles();
       SetValue(FormatBits(ReadBinary(dropped->c_str())));        
    }
    evt.Skip();
}

wxBEGIN_EVENT_TABLE(BitsTextCtrl, wxTextCtrl)
    EVT_MOUSE_EVENTS(BitsTextCtrl::onMouseEvent)
    // NOTE: no entry for EVT_DROP_FILES
wxEND_EVENT_TABLE()

我的处理程序被正确调用并且一切正常,但是wxTextAreaBase中的默认每类处理程序(wxTextArea的父对象是我的输入)。具体来说,它连接到wxTextCtrl::OnDropFiles(注意套管差异“On”vs“on”)似乎是一个默认的处理程序,只是假设输入是文本(在我的情况下不是这样)。

通过wxWidgets事件处理代码,我找到了以下内容。

// from wxWidgets/...event.cpp (with my annotations in [..])
bool wxEvtHandler::TryHereOnly(wxEvent& event)
{
    // If the event handler is disabled it doesn't process any events
    if ( !GetEvtHandlerEnabled() )
        return false;

    // Handle per-instance dynamic event tables first
    [This is the path the calls my handler: does the right thing]
    if ( m_dynamicEvents && SearchDynamicEventTable(event) )
        return true;

    // Then static per-class event tables
    [This is the default per-class handler than clobbers my hard work]
    if ( GetEventHashTable().HandleEvent(event, this) )
        return true;
    .... 

如何禁用每类事件?或者也许改写它? docs没有列出文件丢弃的事件表条目。

更新 好的,所以每个类都有一个条目(只是没有在文档中列出)。 EVT_MOUSE_EVENTS(BitsTextCtrl::onMouseEvent)可以替换构造函数中的Connect调用,但现在我只调用了两个事件处理程序副本。同样的问题。

1 个答案:

答案 0 :(得分:0)

解决方案是避免在事件处理程序中调用wxEvent::Skip。我误解了这种方法。 Skip()表示"不要将下一个处理程序称为#34;。不调用skip告诉wxWindows我们已经完成了这个事件。