Lab 4 보고서 교재 5장 사용자 인터페이스 예제 - 사용자 인터페이스 갱신 이름 학번
실습 목적 및 장비 실습 목적 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0) 메뉴 및 툴바 버튼 이용 방법 메뉴 및 툴바 버튼 설계 ON_COMMAND 마크로 이용 ON_COMMAND_RANGE 마크로 이용 사용자 인터페이스 갱신 처리 UPDATE_COMMAND_UI 메시지 처리 CCmdUI 클래스 멤버 함수 이용 방법 리소스 파일 내용 분석 마우스 커서 형태 변경 표준 커서 이용 사용자 정의 커서 설계 및 설정 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0)
사용자 인터페이스 갱신 예제 프로그램 개요 프로그램 완성 후 *.rc 파일의 내용을 메모장으로 읽어본다 Single Document 애플리케이션 메뉴 항목 선택에 따라 영향 받는 다른 메뉴 항목이나 툴바 갱신 실행 파일(http://cs.sookmyung.ac.kr/class/06395/Lab/CmdUI.exe) 프로그램 완성 후 *.rc 파일의 내용을 메모장으로 읽어본다
메뉴 표시: 다이얼로그 박스 부속 메뉴 메뉴 리소스 추가 메뉴 리소스에 대해 Class Wizard 불러 다이얼로그 클래스에 연계시킴 다이얼로그 속성에서 아래와 같이 메뉴 리소스 ID 설정
Resource View의 Menu IDR_MAINFRAME 메뉴 커맨드 메시지 핸들러 메뉴의 항목을 선택하면, WM_COMMAND 메시지가 발생하여 메시지의 파라미터(wParams)를 통해 커맨드 (메뉴 항목) ID가 전달된다. WM_COMMAND 메시지 처리는 뷰 클래스, 도큐먼트 클래스, 메인프레임 클래스, 또는 애플리케이션 클래스 어디에서나 할 수 있다. Resource View의 Menu IDR_MAINFRAME
메뉴 커맨드 메시지 핸들러 빨간색 메뉴항목이 선택되었을 때 수행될 메시지 핸들러 작성
메뉴 커맨드 메시지 핸들러 void CMainFrame::OnRed() { m_nColor = ID_RED; } void CMainFrame::OnYellow() m_nColor = ID_YELLOW; void CMainFrame::OnBlue() m_nColor = ID_BLUE;
ON_UPDATE_COMMAND_UI_RANGE 매크로
CCmdUI::Enable 함수 메뉴를 활성화/비활성화 시킴 BEGIN_MESSAGE_MAP(CCmdUIView, CView) … ON_UPDATE_COMMAND_UI(ID_BEGIN, OnUpdateBegin) ON_UPDATE_COMMAND_UI(ID_END, OnUpdateEnd) END_MESSAGE_MAP() void CCmdUIView::OnUpdateBegin(CCmdUI *pCmdUI) { pCmdUI->Enable(!m_bStart); } void CCmdUIView::OnUpdateEnd(CCmdUI *pCmdUI) pCmdUI->Enable(m_bStart);
CCmdUI::SetText 함수 메뉴의 캡션 바꾸기 (m_bStart 값에 따라 작업 중단/작업 시작 메뉴를 변경하는 코드를 완성하라 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_COMMAND(IDM_BEGINEND, OnBeginend) ON_UPDATE_COMMAND_UI(IDM_BEGINEND, OnUpdateBeginend) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CMainFrame::OnUpdateBeginend(CCmdUI* pCmdUI) { }
CCmdUI::SetCheck 함수 메뉴에 체크 표시 class CMainFrame: public CFrameWnd { //… UINT m_nColor; } CMainFrame::CMainFrame() { m_nColor = ID_RED; } BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_COMMAND_RANGE(ID_RED, ID_BLUE, OnColorCheck) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CMainFrame::OnColorCheck(UINT nID) { m_nColor = nID; }
CCmdUI::SetCheck 함수 일괄 처리를 위해 ON_UPDATE_COMMAND_UI_RANGE 마크로를 이용 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_COMMAND_RANGE(ID_RED, ID_BLUE, OnColorCheck) ON_UPDATE_COMMAND_UI_RANGE(ID_RED, ID_BLUE, OnUpdateColorCheck) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CMainFrame::OnUpdateColorCheck(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_nColor == pCmdUI->m_nID); }
CCmdUI::SetRadio 함수 SetCheck 와 동일 void CMainFrame::OnUpdateColorRadio(CCmdUI* pCmdUI) { pCmdUI->SetRadio(m_nColor == pCmdUI->m_nID); }
SetCheck와 SetRadio의 동기화를 위한 작업 menuitem 들을 위한 리소스 ID 부여 방법 SetCheck 항목: ID_RED, ID_YELLOW, ID_BLUE SetRadio 항목: ID_RED2, ID_YELLOW2, ID_BLUE2 SetRadio menuitem 들을 위한 핸들러를 작성해 보시오.
보고서 요구사항 툴바를 메뉴 항목에 연동시키는 방법: