C ++事件(焦点)处理

时间:2010-04-21 02:47:31

标签: c++ event-handling wxwidgets wxtextctrl

由于评论,我添加了以下代码

(在BasicPanel中)

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;
                ...    ...     ...
    }

当用户将注意力集中在他们正在使用的文本框上时,所有添加到代码中的内容都不会执行任何操作...


问题1:我正在使用wxWidgets(C ++)并遇到了一个无法找到任何帮助的问题。我创建了几个wxTextCtrl框,并希望程序在用户“杀死焦点时”更新其中的简单计算。我在wxWidgets网页上找不到关于这个主题的任何文档,并且谷歌搜索它只提出了wxPython。我发现的两个事件是:EVT_COMMAND_KILL_FOCUS - EVT_KILL_FOCUS,我找不到任何代码片段。任何人都可以给我一个简短的例子或引导我到一个有用的页面吗?

Q2:我是否必须创建一个事件来处理我的8个wxTextCtrl框中的每一个被杀死的焦点?在我必须创建一个不同的事件的情况下:我如何让每个事件彼此区分?我知道我必须为每个wxTextCtrl框创建新的wxID,但是如何才能触发正确的wxID?

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

1 个答案:

答案 0 :(得分:2)

好的,首先,这是放入BasicPanel课程的代码:

void OnKillFocus(wxFocusEvent& event);

然后将以下内容添加到BasicPanel构造函数的末尾:

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

您需要为每个文本控件重复上述代码,并将ID_TEXTCTRL替换为控件的实际ID。

然后,只要其中一个控件失去焦点,就会调用下面的代码。

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

要确定OnKillFocus内生成事件的控件的ID,您可以使用以下内容:

event.GetId()