【问题标题】:wxWidgets event focus textcontrolwxWidgets 事件焦点文本控件
【发布时间】:2013-09-17 11:38:22
【问题描述】:

我还有一个关于事件和焦点的 wxWidgets 问题。

我已经在这里查看了教程和这个老问题,但我仍然遇到问题C++ Event (Focus) Handling

基本上我有一个包含两个 wxTextCtrl 元素和一个按钮的对话框。 我想要实现的是,当我点击按钮时,它需要告诉我两个元素中的哪一个先前具有焦点。

在我的对话框的构造函数中,我创建了所有元素,然后将它们连接到事件处理程序,如下所示:Ttop->Connect(TOP,wxEVT_KILL_FOCUS,(wxObjectEventFunction)&UI_ADDENTRY::hasfocus); Tbottom->Connect(BOTTOM,wxEVT_KILL_FOCUS,(wxObjectEventFunction)&UI_ADDENTRY::hasfocus);

然后有一个事件处理程序可以确保 id 成为焦点

void UI_ADDENTRY::hasfocus(wxFocusEvent& event){
    focus= event.GetId();
    event.Skip();}

但是,当我尝试在 Button 函数中访问焦点时,它总是告诉我:0 而不是 TOP 或 BOTTOM / 我给 textcontrols 的 ids

void UI_ADDENTRY::OnRecord(wxCommandEvent &event){
     wxString tmp;
     tmp << this->focus;
     wxMessageBox(tmp);}

我做错了什么?是否有另一种方法可以找出两个文本框中的哪一个最后成为焦点?

谢谢

【问题讨论】:

  • 您不能在按钮单击处理程序中检查Ttop-&gt;HasFocus()Tbottom-&gt;HasFocus() 吗?
  • 我最初尝试过...就像那样 if(Ttop->HasFocus()) { wxMessageBox("TOP"); } 但它似乎并不都是真的
  • 单击按钮会从 wxTextCtrl 移除焦点。如果它设置了一个竞争条件,这将使它有理由只有时返回 true。
  • 是的,你是对的。 FindFocus() 只会返回我单击的按钮的 ID,只是想知道解决方案可能是什么——当然我不能成为第一个必须处理这个问题的人——但谷歌一点帮助也没有/ wxWidgets 的文档我不清楚。

标签: events wxwidgets


【解决方案1】:

最简单的方法是在您的文本控件中捕获EVT_SET_FOCUS 并记住最后收到它的那个。这并不比你正在做的更难,但应该可以毫无问题地工作。

很遗憾,FWIW EVT_KILL_FOCUS 无法在所有平台上一致实施,特别是 GTK+ 没有提供任何关于窗口焦点丢失的信息。

【讨论】:

  • 谢谢你的回复,不过我也试过了。我有一个 int id;作为我班的一员。然后我在事件处理程序中写了这个: hasfocus(wxFocusEvent& event){ this->id = event.GetId();但 id 始终为 0 event.Skip();}
  • event.GetId() 与您的班级成员 id 不同...请改用GetEventObject()
【解决方案2】:

你的意思是 event.GetWindow().GetId()。虽然我不确定你是如何从 int 转换为 string 的。

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多