Как установить несколько событий для функции

#c #events #wxwidgets

#c #Мероприятия #wxwidgets

Вопрос:

Как вызвать функцию, к которой уже прикреплено событие?

Я хочу иметь возможность вызывать функцию с чем-то вроде этого:

 statsDialog::statsDialog(..) : wxDialog(..) {
    updateStats();
}
  

Или, как привязать несколько обработчиков событий к функции? Например, вызовите updateStats с wxEVT_SET_FOCUS событием И при UPDATE_STATS_BUTTON нажатии. Как я могу сделать это без дублирования кода (скопировав функцию updateStats, просто изменив ее на wxFocusEventHandler )?

 BEGIN_EVENT_TABLE(statsDialog, wxDialog)
EVT_BUTTON(UPDATE_STATS_BUTTON, statsDialog::updateStats)
END_EVENT_TABLE()

statsDialog::statsDialog(..) : wxDialog(..) {    
    // layout stuff
}

void
statsDialog::updateStats(wxCommandEventamp; event) {
    // do stuff on dialog focus AND when UPDATE_STATS_BUTTON is pressed
}
  

Ответ №1:

Просто вызовите функцию, вызываемую DoUpdateStats() как из обработчиков событий focus, так и из обработчиков событий button. Это особенно тривиально при использовании C 11 с Bind() :

 Bind(wxEVT_SET_FOCUS, [](wxFocusEventamp; e) { e.Skip(); DoUpdateStats(); });
btn->Bind(wxEVT_BUTTON, [](wxCommandEventamp;) { DoUpdateStats(); });
  

Комментарии:

1. Спасибо! Работает, но для компиляции пришлось добавить amp; в скобках. updateStatsButton->Bind(wxEVT_BUTTON, [amp;](wxCommandEventamp;) { DoUpdateStats(); });

2. Узел захвата по умолчанию не нужен, если DoUpdateStats() это глобальная функция, но если это метод-член, вам нужно захватить this . Однако, возможно, лучше сделать это явно, чем использовать режим захвата по умолчанию.