【问题标题】:C++ Event (Focus) HandlingC++ 事件(焦点)处理
【发布时间】:2011-02-10 10:05:01
【问题描述】:

由于 cmets 我添加了以下代码

(在基本面板中)

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 网页上找不到关于这个主题的任何文档,谷歌搜索它只找到了 wxPython。我发现的两个事件是:EVT_COMMAND_KILL_FOCUS - EVT_KILL_FOCUS 对于这两个事件我都找不到任何 sn-p。谁能给我一个简短的例子或引导我到一个有用的页面?

Q2:我是否必须创建一个事件来处理我的 8 个wxTextCtrl 框中的每一个被杀死的焦点?如果我必须创建一个不同的事件:我如何让每个事件彼此区分开来?我知道我必须为每个 wxTextCtrl 框创建新的 wxID,但是如何才能触发正确的 wxID?
class BasicPanel : public wxPanel { ...     
    wxTextCtrl* one;
    wxTextCtrl* two;
    wxTextCtrl* three;
    wxTextCtrl* four; ... }

【问题讨论】:

  • 我发现了问题...请参阅下面对我的答案的评论。

标签: c++ event-handling wxwidgets wxtextctrl


【解决方案1】:

好的,首先,这是要放入 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()

【讨论】:

  • 添加建议的更改后...没有任何不同。
  • @Walter:好的,我想通了:您需要在文本控件上调用Connect。因此,上面的“连接”行将更改为 TextCtrl->Connect(....); 其中 TextCtrl 是指向文本控件的指针。
  • 这行得通,但回调似乎没有绑定到 BasicPanel 实例。 this 指针是垃圾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多