在 wxWidgets 中的 wxTextCtrl 上手动触发 ENTER 键按下事件C++?



我有这个文本控件:

FTextCtrl = new wxTextCtrl(parent, wxID_ANY, _("Text"), wxPoint(20, 20), wxDefaultSize, wxTE_CENTRE | wxTE_PROCESS_ENTER, wxDefaultValidator, _T("ID_TC"));
FTextCtrl->Connect(wxEVT_CHAR, (wxObjectEventFunction)OnTextCharEvnt, NULL, this);

每当在文本控件上按Enter键时,都会调用此函数OnTextCharEvnt

如何手动触发此事件(当我的文本光标位于文本控件内时(并OnTextCharEvnt使用它调用此函数?

我使用EVT_TEXT_ENTER它有效;

样本.h

enum{
TEXT_FTextCtrl
}

样品.cpp

FTextCtrl = new wxTextCtrl(parent, TEXT_FTextCtrl, wxT("Text"), wxPoint(20, 20), wxDefaultSize, wxTE_CENTRE | wxTE_PROCESS_ENTER, wxDefaultValidator, _T("ID_TC"));
BEGIN_EVENT_TABLE(Sample, wxFrame)
EVT_TEXT_ENTER(TEXT_FTextCtrl, Sample::OnTextCharEvnt)
END_EVENT_TABLE()

你不需要触发任何事件来调用你自己的函数——只需直接调用它。直接调用事件处理程序很尴尬,不建议这样做,但这是一个避免它的简单解决方案 - 只需有一个普通函数,您可以从该事件处理程序调用它,也可以直接调用:

void Sample::OnTextCharEvnt(wxCommandEvent& event) { DoHandleCharEvent(event.GetUnicodeKey()); }
void Sample::DoHandleCharEvent(wchar_t key) { ... your actual code for handling it ... }
void Sample::SomeOtherFunction() { DoHandleEnter(); }

如果您使用推荐的Bind()函数而不是旧的Connect(),您甚至可以通过使用lambda来完全避免琐碎的OnTextCharEvnt(),例如:

FTextCtrl->Bind(wxEVT_CHAR, [](wxCommandEvent& event) {
DoHandleCharEvent(event.GetUnicodeKey());
});

所有这些都忽略了一个事实,即您不应该首先将wxEVT_CHARwxTextCtrl一起使用,而应该处理wxEVT_TEXTwxEVT_TEXT_ENTER或两者,而不是较低级别的 char 事件(例如,如果用户在控件中粘贴某些内容,则根本不会触发(。

相关内容

  • 没有找到相关文章

最新更新