Справочная информация : в Excel, когда вы выполняете вырезку для выделенного блока, значения не перемещаются, пока вы не вставите.После обрезки, если происходит какое-либо событие (не все, кроме большинства), кроме вставки, блок перемещается , а не .
Я пытаюсь реализовать ту же идею.У меня есть 2 функции:
void MyFrame::OnCut(wxCommandEvent& evt);
void MyFrame::OnPaste(wxCommandEvent& evt);
Также определены следующие события:
wxDEFINE_EVENT(CUT_EVENT, wxCommandEvent);
wxDEFINE_EVENT(PASTE_EVENT, wxCommandEvent);
Код в OnCut структурирован в 2 блока.1-й блок должен выполняться при вызове cut, 2-й блок должен выполняться при вызове 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..
Пока что это хорошо работает, если событие Cut равно сразу , за которым следует событие вставки.Тем не менее, я хочу, чтобы 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_PASTE и ID_CUT, должны сбрасывать m_CutEventCalled=false
.Однако пока что безуспешно.Я предполагаю, что это как-то связано с ProcessEvent
.
Другими словами, как я могу узнать, что событие any
, отличное от события вставки, произошло после события вырезания.Одним из решений было бы то, что я могу поместить m_CutEventCalled=false
во все другие обработчики событий, но это не кажется элегантным решением.
Любые идеи приветствуются.