Обработка событий C++ (фокус)

Из-за комментариев я добавил следующий код

(в базовой панели)

Connect(CTRL_ONE, wxEVT_KILL_FOCUS, (wxObjectEventFunction)&BasicPanel::OnKillFocus);
Connect(CTRL_TWO,wxEVT_KILL_FOCUS, (wxObjectEventFunction)&BasicPanel::OnKillFocus);
Connect(CTRL_THREE, wxEVT_KILL_FOCUS, (wxObjectEventFunction)&BasicPanel::OnKillFocus);
Connect(CTRL_FOUR, wxEVT_KILL_FOCUS, (wxObjectEventFunction)&BasicPanel::OnKillFocus);
Connect(CTRL_FIVE, wxEVT_KILL_FOCUS, (wxObjectEventFunction)&BasicPanel::OnKillFocus);

(перечисления)

    CTRL_NAME = wxID_HIGHEST + 5, // 6004
    CTRL_ADDRESS = wxID_HIGHEST + 6, // 6005
    CTRL_PHONENUMBER = wxID_HIGHEST + 7, // 6006
    CTRL_SS = wxID_HIGHEST + 8, // 6007
    CTRL_EMPNUMBER = wxID_HIGHEST + 9 // 6008

(Функция OnKillFocus — объявление включено, как было предложено)

void BasicPanel::OnKillFocus(wxFocusEvent& event) {
    switch (event.GetId()) {
        case 6004:
            ...
            break;
                ...    ...     ...
    }

Все это, добавленное в код, ничего не делает, когда пользователь переключает фокус на используемое текстовое поле...


Q1: Я использую wxWidgets (C++) и столкнулся с проблемой, что не могу найти никакой помощи. Я создал несколько блоков wxTextCtrl и хотел бы, чтобы программа обновляла в них простые вычисления, когда пользователь «убивает фокус». Я не смог найти никакой документации по этому вопросу на веб-странице wxWidgets, и поиск в Google показал только wxPython. Я нашел два события: EVT_COMMAND_KILL_FOCUS - EVT_KILL_FOCUS ни для одного из которых я не смог найти ни одного фрагмента. Может ли кто-нибудь дать мне короткий пример или привести меня на страницу, которая была бы полезна?

Q2:Would i have to create an event to handle the focus being killed for each of my 8 wxTextCtrl boxes? In the case that i have to create a different event: How would i get each event to differentiate from each other? I know i will have to create new wxID's for each of the wxTextCtrl boxes but how do I get the correct one to be triggered?

class BasicPanel : public wxPanel { ...     
    wxTextCtrl* one;
    wxTextCtrl* two;
    wxTextCtrl* three;
    wxTextCtrl* four; ... }

person Wallter    schedule 21.04.2010    source источник
comment
Я нашел проблему... см. комментарий к моему ответу ниже.   -  person Nathan Osman    schedule 21.04.2010


Ответы (1)


Хорошо, во-первых, вот код для вашего класса BasicPanel:

void OnKillFocus(wxFocusEvent& event);

Затем добавьте следующее в конец конструктора BasicPanel:

Connect(ID_TEXTCTRL,
        wxEVT_KILL_FOCUS ,
        (wxObjectEventFunction)&BasicPanel::OnKillFocus);

Вам нужно будет повторить приведенный выше код для каждого текстового элемента управления и заменить ID_TEXTCTRL фактическим идентификатором элемента управления.

Затем приведенный ниже код будет вызываться всякий раз, когда один из элементов управления теряет фокус.

void BasicPanel::OnKillFocus(wxFocusEvent& event)
{
    // code goes here...
}

Чтобы определить идентификатор элемента управления, сгенерировавшего событие в пределах OnKillFocus, можно использовать следующее:

event.GetId()
person Nathan Osman    schedule 21.04.2010
comment
После добавления предложенных изменений... ничего не происходит. - person Wallter; 21.04.2010
comment
@Walter: Хорошо, я понял: вам нужно вызвать Connect в текстовом элементе управления. Таким образом, строка «Подключиться» выше будет изменена на TextCtrl->Connect(....);, где TextCtrl — указатель на текстовый элемент управления. - person Nathan Osman; 21.04.2010
comment
Это работает, но обратный вызов не привязан к экземпляру BasicPanel. Указатель this — мусор. - person tenpn; 31.01.2012