wxWidgets에서 글을 작성한 후에 실행 취소를 하는 기능을 제공해보자.

 실행 취소(Undo)는 wxWidgets에서 ID를 지원해주기 때문에 wxMain.h에서 ID을 추가할 필요없다.

 

 그래서 이벤트 핸들러만 제작하면 되는데.

 wxMain.h에 다음과 같이 추가해주자.

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

 

이후에 Edit의 하위 메뉴를 추가하주자.

1
2
3
4
5
6
    m_menuEdit = new wxMenu;
    m_menuEdit->Append(wxID_UNDO, "&Undo\tCtrl+Z""Undo the last 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

 

이 후에 이벤트 핸들러랑 연결될 수 있게 적용해준다.

1
2
3
4
    // 메뉴 Edit에 관련된 이벤트 핸들러
    Bind(wxEVT_MENU, &MyFrame::OnUndo, this, wxID_UNDO);
    Bind(wxEVT_MENU, &MyFrame::OnInsertDateTime, this, ID_DATETIME);
    Bind(wxEVT_MENU, &MyFrame::OnSelectAll, this, ID_DATETIME);
cs

 

이렇게 하면, 이벤트 핸들러인 OnUndo랑 연동된다.

이제 OnUndo를 정의해주면, 실행 취소가 가능하다.

여기서 실행 취소는 wxTextCtrl에서 실행 취소 기능을 지원해주기 때문에 OnUndo는 그걸 이용하면 된다.

1
2
3
4
5
6
void MyFrame::OnUndo(wxCommandEvent& event) {
    if (m_textControl->CanUndo()) {
        m_textControl->Undo();
    }
}
 
cs

 

실행 취소가 활성화 비활성화로 실행이 존재할 경우에 활성화되고 그런것이 전혀 없다면, 실행 취소를 비활성화 시키는 방식을 구현하기 위해서는 메뉴 항목의 상태를 동적으로 업데이트하는 장치가 필요하다.

wxWidgets에서는 'wxUpdateUIEvent'라는 기능을 지원해준다.

이걸 이용하는 방법을 위해서

wxMain.h에 이벤트 핸들러를 선언한다.

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

 

 

wxMain.cpp에서 OnUpdateUndo라는 이벤트 핸들러를 wxEVT_UPDATE_UI 종류로 연결시켜준다.

1
2
    // 메뉴바 갱신 이벤트 핸들러
    Bind(wxEVT_UPDATE_UI, &MyFrame::OnUpdateUndo, this, wxID_UNDO);
cs

 

이렇게 해서 wxMain.h에 선언했던 'OnUpdateUndo'를 정의해준다.

1
2
3
4
5
// 메뉴바 갱신 이벤트 핸들러
void MyFrame::OnUpdateUndo(wxUpdateUIEvent& event)
{
    event.Enable(m_textControl->CanUndo());
}
cs

 

 실행취소가 가능할때 활성화되고,실행취소가 불가능하면 비활성화를 적용이 가능해진다.

 

Posted by JunkMam
,