wxWidgets의 textCtrl에 실행 취소(Undo)와 같이 다시 실행(Redo)가 존재한다.

이걸 이용해서 구현이 가능하다.

 

Redo를 하기 위한 이벤트 핸들러를 추가하자.

 wxMain.h

1
2
3
4
5
    // Edit 메뉴에 적용할 이벤트 핸들러
    void OnUndo(wxCommandEvent& event);
    void OnRedo(wxCommandEvent& event);
    void OnSelectAll(wxCommandEvent& event);
    void OnInsertDateTime(wxCommandEvent& event);
cs

 

Undo와 같이 Redo가 가능할 경우에 활성화를 할수 있게. 선언하자.

 wxMain.h

1
2
3
    // 메뉴 동적 활성화 하기 위한 이벤트 핸들러
    void OnUpdateUndo(wxUpdateUIEvent& event);
    void OnUpdateRedo(wxUpdateUIEvent& event);
cs

 

이제 wxMain.cpp에 작업을 하자.

먼저 메뉴를 추가하자.

wxMain.cpp

1
2
3
4
5
6
7
    m_menuEdit = new wxMenu;
    m_menuEdit->Append(wxID_UNDO, "&Undo\tCtrl+Z""Undo the last action");
    m_menuEdit->Append(wxID_REDO, "&Redo\tCtrl+Y""Redo the last undone action");
    m_menuFile->AppendSeparator();
    m_menuEdit->Append(ID_SELECT_ALL, "&Select All\tCtrl+A""Select all text");
    m_menuFile->AppendSeparator();
    m_menuEdit->AppendCheckItem(ID_DATETIME, "&DateTime\tF5""DateTime");
cs

 

정의 및 이벤트 핸들러를 연결한다.

wxMain.cpp

1
2
3
4
5
6
7
8
9
10
    // 메뉴 Edit에 관련된 이벤트 핸들러
    Bind(wxEVT_MENU, &MyFrame::OnUndo, this, wxID_UNDO);
    Bind(wxEVT_MENU, &MyFrame::OnRedo, this, wxID_REDO);
    Bind(wxEVT_MENU, &MyFrame::OnInsertDateTime, this, ID_DATETIME);
    Bind(wxEVT_MENU, &MyFrame::OnSelectAll, this, ID_DATETIME);
 
 
    // 메뉴바 갱신 이벤트 핸들러
    Bind(wxEVT_UPDATE_UI, &MyFrame::OnUpdateUndo, this, wxID_UNDO);
    Bind(wxEVT_UPDATE_UI, &MyFrame::OnUpdateRedo, this, wxID_REDO);
cs

 

메뉴와 메뉴바 갱신에 관련된 이벤트 핸들러를 정의한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void MyFrame::OnUndo(wxCommandEvent& event) {
    if (m_textControl->CanUndo()) {
        m_textControl->Undo();
    }
}
 
void MyFrame::OnRedo(wxCommandEvent& event)
{
    if (m_textControl->CanRedo())
    {
        m_textControl->Redo();
    }
}
 
// 메뉴바 갱신 이벤트 핸들러
void MyFrame::OnUpdateUndo(wxUpdateUIEvent& event)
{
    event.Enable(m_textControl->CanUndo());
}
 
// 메뉴바 갱신 이벤트 핸들러
void MyFrame::OnUpdateRedo(wxUpdateUIEvent& event)
{
    event.Enable(m_textControl->CanRedo());
}
cs

 

이렇게하면, 다시 시작을 구현할 수 있다.

 

Posted by JunkMam
,