2016-03-11 3 views
0

WxWidgets 3.0.2, MSVC 2013.wxTextCtrl в обработчик класса переопределяет за экземпляр обработчика

Суть этого вопроса: как можно переопределить файл по умолчанию обработчик падение на 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 (примечание, что разница в корпусе «Вкл.» Против «включено») представляется обработчиком по умолчанию, который просто предполагает, что ввод - это текст (который у меня не в моем случае).

Копаясь через код обработки событий 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 в конструкторе, но теперь у меня есть только две копии вызываемого обработчика событий. Та же проблема.

ответ

0

Решение было избежать вызова wxEvent::Skip в обработчике событий. Я неправильно понял этот метод. Skip() означает, что «не conusme вызывает следующий обработчик». Не вызывающий skip указывает wxWindows, что мы закончили с событием.