给定顺序中的事件处理
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中的代码分为两个块。调用剪切时应执行第一个块,调用粘贴时应执行第二个块。
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
,比如用户改变了主意,在剪切后没有粘贴而是触发了复制事件。
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
放置在所有其他事件处理程序中,但这似乎不是一个优雅的解决方案。
任何想法都值得赞赏。
这是一种非常奇怪的解决问题的方法。你绝对不需要干扰事件处理,因为"粘贴"事件是否紧跟在"剪切"之后根本无关紧要(事实上,剧透:永远不会,在用户生成的任何此类事件之间总会有一些中间事件(。
您只需要记住OnCut()
中的"剪切"数据,然后在OnPaste()
中复制并删除它(如果复制成功(。
相关文章:
- 给定顺序中的事件处理
- C++事件系统 - 多态事件和事件处理程序
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 更好的事件处理机制?
- 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?
- "动态创建的事件处理程序"复选框
- Wxwidgets - 如何添加调整大小事件处理程序以使"X"绘图随窗口调整大小?
- Qt 键按事件处理程序仅在按下 ctrl、alt 或 shift 键时做出反应
- 类成员作为 C++ 中 C 样式事件的事件处理程序
- C 设计事件处理程序类
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 如何在 c++ linux 中创建事件处理程序
- 解除 lambda 事件处理程序的绑定
- 这是MFC C 中单个选择的ComboBox的事件处理程序
- 审核的实时事件处理 C/C++
- 指纹读取器 - 从 C# 代码创建事件处理程序到C++的问题
- 为什么我的Windows控制台关闭事件处理程序超时
- 无法让 matplotlib 事件处理程序与 Boost.Python 一起工作
- 事件处理程序是Embarcadero C++Builder中的重入程序吗
- QTSCXML状态机中的事件处理