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)

  1. void CDocViewEx1Doc::OnDocumentModify()
  2. void CDocViewEx1Doc::OnDocumentClear()
  3. void CDocViewEx1Doc::OnUpdateDocumentClear(CCmdUI *pCmdUI)
  4. 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);
	}
}