给定顺序的事件处理

时间:2018-10-28 05:17:16

标签: c++ wxwidgets

背景信息:在Excel中,当您对选定的块执行剪切时,只有粘贴后值才会移动。剪切后,如果发生除粘贴以外的任何事件(不是全部,但不是全部),则该块移动。

我正在尝试实现相同的想法。我有2个功能:

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在剪切和粘贴之间发生其他事件时,说用户改变了主意并且剪切后没有粘贴,而是触发了复制事件。

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放在所有其他事件处理程序中,但这似乎并不是一个很好的解决方案。

任何想法都值得赞赏。

1 个答案:

答案 0 :(得分:2)

这是解决问题的非常奇怪的方法。您绝对不需要干预事件处理,因为“粘贴”事件是否紧随“剪切”之后根本不重要(事实上,剧透:永远不会,会有一些中间事件在用户生成的任何此类事件之间)。

您只需要记住OnCut()中的“剪切”数据,然后将其复制并删除(如果复制成功,则在OnPaste()中)。