Programming/MFC
Example : DocViewEx2
부풍
2009. 8. 27. 15:38
Resource Editor
메뉴 추가
- Icon & Menu :
- ID_COMMAND_HOME, ID_COMMAND_END, ID_COMMAND_PREV, ID_COMMAND_NEXT
- ID_COMMAND_DEL, ID_COMMAND_INS
- IDD_DOCVIEWEX1_FORM의 IDC_NAME, IDC_GRADE 버튼 속성을 Read Only로 수정한다. 이것은 직접 수정하지 않고 메뉴를 통해서 수정하게 하기 위함이다.
4개의 함수 삭제 (ID_DOCUMENT_MODIFY, ID_COMMAND_CLEAR, IDC_ENTER)
- void CDocViewEx1Doc::OnDocumentModify()
- void CDocViewEx1Doc::OnDocumentClear()
- void CDocViewEx1Doc::OnUpdateDocumentClear(CCmdUI *pCmdUI)
- void CDocViewEx1View::OnBnClickedEnter()
초기 화면에서 입력(IDC_ENTER) 버튼 삭제한다. 이것은 Update 버튼인데 화면에서 수정할 수 없도록 고쳤기 때문에 불필요한 버튼이다.
만약 뒤에서 Modify, Clear 버튼을 사용하는 코드를 작성하려면 1~3 번을 삭제하지 않고 변경하면 된다.
변수 생성
CDocViewEx1Doc.h
CObList m_studentList; // Student m_Student -> CObList m_studentList (m_listStudent?)
CDocViewEx1View.h
private: POSITION m_position;
기존 코드 수정
CStudent 클래스 변경
class CStudent : public CObject { // ~~~~ };
Event 처리 수정
void CDocViewEx1View::OnBnClickedEnter() { UpdateData(TRUE); CDocViewEx1Doc *pDoc = GetDocument(); if (m_position) { CStudent *pStudent = (CStudent*)pDoc->m_studentList.GetAt(m_position); pStudent->m_nGrade = m_nGrade; pStudent->m_strName = m_strName; } } void CDocViewEx1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CDocViewEx1Doc *pDoc = GetDocument(); if (m_position) { CStudent *pStudent = (CStudent*)pDoc->m_studentList.GetAt(m_position); m_nGrade = pStudent->m_nGrade; m_strName = pStudent->m_strName; } else { m_strName = ""; m_nGrade = 0; } UpdateData(FALSE); }
Message 처리
삽입, 삭제
void CDocViewEx1View::OnCommandIns() { CDocViewEx1Doc *pDoc = GetDocument(); CStudentDialog dlg; if (dlg.DoModal() == IDOK) { CStudent *pStudent = new CStudent(dlg.m_strName, dlg.m_nGrade); m_position = pDoc->m_studentList.InsertAfter(m_position, pStudent); pDoc->UpdateAllViews(NULL); } } void CDocViewEx1View::OnCommandDel() { CDocViewEx1Doc *pDoc = GetDocument(); POSITION curPos = m_position; pDoc->m_studentList.GetNext(m_position); CStudent *ps = (CStudent*)pDoc->m_studentList.GetAt(curPos); pDoc->m_studentList.RemoveAt(curPos); delete ps; if (!m_position) m_position = pDoc->m_studentList.GetTailPosition(); pDoc->UpdateAllViews(NULL); }
Cursor 이동
void CDocViewEx1View::OnCommandHome() { CDocViewEx1Doc *pDoc = GetDocument(); m_position = pDoc->m_studentList.GetHeadPosition(); pDoc->UpdateAllViews(NULL); } int CDocViewEx1View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFormView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 여기에 특수화된 작성 코드를 추가합니다. CDocViewEx1Doc *pDoc = GetDocument(); m_position = pDoc->m_studentList.GetHeadPosition(); return 0; } void CDocViewEx1View::OnCommandEnd() { CDocViewEx1Doc *pDoc = GetDocument(); m_position = pDoc->m_studentList.GetTailPosition(); pDoc->UpdateAllViews(NULL); } void CDocViewEx1View::OnCommandPrev() // 교안과 다름 { CDocViewEx1Doc *pDoc = GetDocument(); if (m_position && m_position != pDoc->m_studentList.GetHeadPosition()) { pDoc->m_studentList.GetPrev(m_position); pDoc->UpdateAllViews(NULL); } } void CDocViewEx1View::OnCommandNext() // 교안과 다름 { CDocViewEx1Doc *pDoc = GetDocument(); if (m_position && m_position != pDoc->m_studentList.GetTailPosition()) { pDoc->m_studentList.GetNext(m_position); pDoc->UpdateAllViews(NULL); } }
Update Command UI
void CDocViewEx1View::OnUpdateCommandHome(CCmdUI *pCmdUI) { CDocViewEx1Doc *pDoc = GetDocument(); pCmdUI->Enable(m_position && m_position != pDoc->m_studentList.GetHeadPosition()); } void CDocViewEx1View::OnUpdateCommandEnd(CCmdUI *pCmdUI) { CDocViewEx1Doc *pDoc = GetDocument(); pCmdUI->Enable(m_position && m_position != pDoc->m_studentList.GetTailPosition()); } void CDocViewEx1View::OnUpdateCommandNext(CCmdUI *pCmdUI) { CDocViewEx1Doc *pDoc = GetDocument(); POSITION pos = m_position; if (pos) pDoc->m_studentList.GetNext(pos); pCmdUI->Enable(pos != 0); } void CDocViewEx1View::OnUpdateCommandPrev(CCmdUI *pCmdUI) { CDocViewEx1Doc *pDoc = GetDocument(); POSITION pos = m_position; if (pos) pDoc->m_studentList.GetPrev(pos); pCmdUI->Enable(pos != 0); } void CDocViewEx1View::OnUpdateCommandDel(CCmdUI *pCmdUI) { pCmdUI->Enable(m_position != 0); }
WM_CREATE
int CDocViewEx1View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFormView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 여기에 특수화된 작성 코드를 추가합니다. CDocViewEx1Doc *pDoc = GetDocument(); m_position = pDoc->m_studentList.GetHeadPosition(); return 0; }
ID_COMMAND_MODIFY, ID_COMMAND_CLEAR 처리 View에 추가
void CDocViewEx1View::OnDocumentModify() { if (m_position) { CDocViewEx1Doc *pDoc = GetDocument(); CStudent *pStudent = (CStudent*)pDoc->m_studentList.GetAt(m_position); CStudentDialog dlg; dlg.m_strName = pStudent->m_strName; dlg.m_nGrade = pStudent->m_nGrade; if (dlg.DoModal() == IDOK) { pStudent->m_strName = dlg.m_strName; pStudent->m_nGrade = dlg.m_nGrade; pDoc->UpdateAllViews(NULL); } } } void CDocViewEx1View::OnDocumentClear() { if (m_position) { CDocViewEx1Doc *pDoc = GetDocument(); CStudent *pStudent = (CStudent*)pDoc->m_studentList.GetAt(m_position); *pStudent = CStudent(); pDoc->UpdateAllViews(NULL); } }