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