в wxWidgets поддерживается два механизма обработки событий.
1) Карты сообщений - механизм призванный облегчить переход с MFC
2) Классы-обработчики позволяют назначать обработчики динамически, во время выполнения программы. Этот механизм напоминает сигналы и слоты, используемые в Qt.
==
например:
Connect(ID_BTN_OK, wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(MainFrame:: OnCommand));
где
ID_BTN_OK - идентификатор кнопки
wxEVT_COMMAND_BUTTON_CLICKED - имя события
В третьем параметре методу передается указатель на обработчик события. В объявлении метода Connect() третий параметр имеет тип wxObjectEventFunction. Указатель на фактически используемый метод-обработчик должен быть приведен к этому типу с помощью специального макроса. В нашем примере обработку события выполняет метод MainFrame:
nCommand(), а необходимое преобразование типа выполняется с помощью макроса wxCommandEventHandler(). Этот макрос используется для всех событий, чьи имена имеют префикс wxEVT_COMMAND (события, которые генерируются различными элементами управления пользовательского интерфейса).
Определение метода-обработчика OnCommand выглядит так:
void MainFrame:: OnCommand(wxCommandEvent& event)
Обработчик не возвращает значений, а единственным его аргументом является ссылка на объект класса wxCommandEvent. Один и тот же обработчик может использоваться для обработки самых разных событий от разных элементов управления. В этом случае из параметра event мы можем получить дополнительную информацию о событии. Класс wxCommandEvent является потомком класса wxEvent – базового для аргументов всех обработчиков событий.
Для генерации событий класс wxEvtHandler и его потомки предоставляют нам методы ProcessEvent() и AddPendingEvent(). Первый метод непосредственно вызывает обработчик события, второй метод позволяет поместить событие в очередь на обработку. У обоих методов определен только один параметр, в котором передается ссылка на объект класса-потомка класса wxEvent. Основываясь на типе этого объекта, wxWidgets определяет, обработчик какого события следует вызвать.
т.е. При создании каждого визуального элемента, который может быть источником событий, мы присваиваем ему числовой идентификатор, заданный константой (напомню, что мы можем выбрать значение wxID_ANY, если нам не нужно обрабатывать события данного элемента). Чтобы назначить обработчик события, мы вызываем метод Connect() объекта, реализующего главное окно. Этому методу передаются идентификатор визуального элемента, имя события и обработчик события.
==
class MainBook : public wxPanel
{
Notebook *m_book;
wxChoice *m_choiceFunc;
.....
protected:
void OnFunction(wxCommandEvent &e);
void OnMouseDClick(wxMouseEvent &e);
public:
....
};
==
MainBook::MainBook(wxWindow *parent): wxPanel( parent )
{
....
m_choiceFunc = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxSize(600, -1), chcs);
m_choiceFunc->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(MainBook::OnFuncListMouseDown), NULL, this);
m_book = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style);
m_book->GetTabContainer()->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(MainBook::OnMouseDClick), NULL, this);
....
}
void MainBook::OnFunction(wxCommandEvent &e)
{
int sel = e.GetSelection();
if(sel != wxNOT_FOUND){
TagEntry *tag = (TagEntry*) m_choiceFunc->GetClientData(sel);
if(tag){
LEditor *editor = ManagerST::Get()->GetActiveEditor();
if(editor) {
wxString pattern(tag->GetPattern());
ManagerST::Get()->FindAndSelect(editor, pattern, tag->GetName());
editor->SetActive();
}
}
}
}
void MainBook::OnMouseDClick(wxMouseEvent& e)
{
wxUnusedVar(e);
Frame::Get()->DoAddNewFile();
}
void MainBook::OnFuncListMouseDown(wxMouseEvent &e)
{
....
e.Skip();
}