给定顺序的事件处理
Event Handling in a Given Order
背景信息:在Excel中,当您对选定的块执行剪切时,在粘贴之前不会移动值。剪切后,如果发生除粘贴之外的任何事件(不是全部,但大多数),块不会移动。
我正在尝试实现相同的想法。我有两个功能:
void MyFrame::OnCut(wxCommandEvent& evt);
void MyFrame::OnPaste(wxCommandEvent& evt);
还定义了以下事件:
wxDEFINE_EVENT(CUT_EVENT, wxCommandEvent);
wxDEFINE_EVENT(PASTE_EVENT, wxCommandEvent);
OnCut 中的代码分为 2 个块。第一个块应该在调用 cut 时执行,第二个块应该在调用 Paste 时执行。
void MyFrame::OnCut(wxCommandEvent& evt)
{
if (evt.GetEventType() != PASTE_EVENT){
m_CutEventCalled = true;
//Some code here
}
if (evt.GetEventType() == PASTE_EVENT)
//Some code here
m_CutEventCalled = false;
}
}
void MyFrame::OnPaste(wxCommandEvent& evt)
{
//Some other code
if(m_CutEventCalled){
wxCommandEvent PasteEvent;
PasteEvent.SetEventType(PASTE_EVENT);
PasteEvent.SetEventObject(this);
Bind(PASTE_EVENT, &MyFrame::OnCut, this);
wxPostEvent(this, PasteEvent);
}
}
剪切和粘贴事件可以通过键盘(如 Ctrl+X)、ContextMenu 或 RibbonButtons 触发。
到目前为止,如果剪切事件是立即,然后是粘贴事件,则效果很好。但是,我希望 m_CutEventCalled=false
当在剪切和粘贴之间发生其他事件时,比如用户改变了 his/her 想法并且在剪切后没有粘贴而是触发了复制事件。
bool MyFrame::ProcessEvent(wxEvent & evt)
{
static wxEvent* s_lastEvent = NULL;
if (&evt == s_lastEvent)
return false;
int evtID = evt.GetId();
//if this part of the code exists the whole thing doesnt work
//otherwise it only works cut immediately followed by paste
if (evtID != ID_PASTE && evtID != ID_CUT)
m_CutEventCalled = false;
return wxMDIChildFrame::ProcessEvent(evt);
}
我的想法是任何 ID 不是 ID_PASTE 和 ID_CUT 的事件都应该重置 m_CutEventCalled=false
。然而,到目前为止还没有成功。我认为它与 ProcessEvent
有关。
换句话说,我怎么知道any
除了粘贴事件之外的事件发生在剪切事件之后。一种解决方案是我可以将 m_CutEventCalled=false
放在所有其他事件处理程序中,但这似乎不是一个优雅的解决方案。
任何想法表示赞赏。
这是一种非常奇怪的解决问题的方法。您绝对不需要干预事件处理,因为 "paste" 事件是否紧随 "cut" 根本无关紧要(事实上,剧透:它永远不会,总会有是用户生成的任何此类事件之间的一些中间事件。
你只需要记住你的OnCut()
中的"cut"数据,然后复制并删除它,如果复制成功,在你的OnPaste()
中。
背景信息:在Excel中,当您对选定的块执行剪切时,在粘贴之前不会移动值。剪切后,如果发生除粘贴之外的任何事件(不是全部,但大多数),块不会移动。
我正在尝试实现相同的想法。我有两个功能:
void MyFrame::OnCut(wxCommandEvent& evt);
void MyFrame::OnPaste(wxCommandEvent& evt);
还定义了以下事件:
wxDEFINE_EVENT(CUT_EVENT, wxCommandEvent);
wxDEFINE_EVENT(PASTE_EVENT, wxCommandEvent);
OnCut 中的代码分为 2 个块。第一个块应该在调用 cut 时执行,第二个块应该在调用 Paste 时执行。
void MyFrame::OnCut(wxCommandEvent& evt)
{
if (evt.GetEventType() != PASTE_EVENT){
m_CutEventCalled = true;
//Some code here
}
if (evt.GetEventType() == PASTE_EVENT)
//Some code here
m_CutEventCalled = false;
}
}
void MyFrame::OnPaste(wxCommandEvent& evt)
{
//Some other code
if(m_CutEventCalled){
wxCommandEvent PasteEvent;
PasteEvent.SetEventType(PASTE_EVENT);
PasteEvent.SetEventObject(this);
Bind(PASTE_EVENT, &MyFrame::OnCut, this);
wxPostEvent(this, PasteEvent);
}
}
剪切和粘贴事件可以通过键盘(如 Ctrl+X)、ContextMenu 或 RibbonButtons 触发。
到目前为止,如果剪切事件是立即,然后是粘贴事件,则效果很好。但是,我希望 m_CutEventCalled=false
当在剪切和粘贴之间发生其他事件时,比如用户改变了 his/her 想法并且在剪切后没有粘贴而是触发了复制事件。
bool MyFrame::ProcessEvent(wxEvent & evt)
{
static wxEvent* s_lastEvent = NULL;
if (&evt == s_lastEvent)
return false;
int evtID = evt.GetId();
//if this part of the code exists the whole thing doesnt work
//otherwise it only works cut immediately followed by paste
if (evtID != ID_PASTE && evtID != ID_CUT)
m_CutEventCalled = false;
return wxMDIChildFrame::ProcessEvent(evt);
}
我的想法是任何 ID 不是 ID_PASTE 和 ID_CUT 的事件都应该重置 m_CutEventCalled=false
。然而,到目前为止还没有成功。我认为它与 ProcessEvent
有关。
换句话说,我怎么知道any
除了粘贴事件之外的事件发生在剪切事件之后。一种解决方案是我可以将 m_CutEventCalled=false
放在所有其他事件处理程序中,但这似乎不是一个优雅的解决方案。
任何想法表示赞赏。
这是一种非常奇怪的解决问题的方法。您绝对不需要干预事件处理,因为 "paste" 事件是否紧随 "cut" 根本无关紧要(事实上,剧透:它永远不会,总会有是用户生成的任何此类事件之间的一些中间事件。
你只需要记住你的OnCut()
中的"cut"数据,然后复制并删除它,如果复制成功,在你的OnPaste()
中。