我有这个文本控件:
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_CHAR
与wxTextCtrl
一起使用,而应该处理wxEVT_TEXT
或wxEVT_TEXT_ENTER
或两者,而不是较低级别的 char 事件(例如,如果用户在控件中粘贴某些内容,则根本不会触发(。