Visual C++ Programming Output and File Department of Digital Contents Sang Il Park
Outline Review: Menu, toolbar and more Status bar How to use the debugger File I/O
Announcement 휴강공고: 중간고사: 4월 15일(화), 4월 17일(목) 4월 24일(목) 수업시간 문제 5문제 - 코딩시험
Review: 메뉴 생성 두 가지 방법 메뉴 리소스 프로그램 실행 중 메뉴 생성 메뉴 리소스 작성
Review: 메뉴 명령 처리 메뉴 명령 처리 과정 ① 명령 항목을 마우스나 키보드로 선택 ② WM_COMMAND 메시지 발생 (각각의 ID역시 전송) ③ WM_COMMAND 메시지 핸들러에서 메뉴 명령 처리
Review: 메뉴 명령 처리 속성 창을 이용
Review: 메뉴 명령 처리 메뉴 명령 처리 예: 3가지의 추가 1. Header file에 : 함수 선언 afx_msg void CChildView::OnColorRed() 2. Source file 앞 쪽에: Massage Map BEGIN_MESSAGE_MAP(CChildView,CWnd ) ... ON_COMMAND(ID_COLOR_RED, OnColorRed) END_MESSAGE_MAP() 3. Source file 속에: 함수 정의 void CChildView::OnColorRed() { }
Review: Toolbar 툴바 MFC 클래스 선택하면 WM_COMMAND 메시지 발생!
Review: 메뉴 직접 코딩하기 CMenu 객체: 메뉴의 생긴 모양, ID등을 생성 맴버함수: AppendMenu() Flag: MF_STRING (일반적인 메뉴 항목) MF_POPUP (하위 메뉴 연결 시) MF_SEPARATOR ID: MF_STRING 의 경우: Command ID MF_POPUP 의 경우: 붙일 하위 메뉴의 주소 (Detatch() 함수이용) bool CMenu::AppendMenu( Flag, ID, Caption )
Review: 컨텍스트 메뉴 1. 마우스 오른쪽 버튼 클릭 또는 키 누름 2. WM_CONTEXTMENU 메시지 발생 1. 마우스 오른쪽 버튼 클릭 또는 키 누름 2. WM_CONTEXTMENU 메시지 발생 3. 메시지 핸들러에서 메뉴를 띄우는 코드 작성 컨텍스트 메뉴 = 단축 메뉴 = 팝업 메뉴
Review: 컨텍스트 메뉴 사용 예 void CChildView::OnContextMenu(CWnd* pWnd, CPoint point) { CMenu menuPopup; menuPopup.CreatePopupMenu(); menuPopup.AppendMenu(MF_STRING, 201, "Red (&R)"); menuPopup.AppendMenu(MF_STRING, 202, "Green (&G)"); menuPopup.AppendMenu(MF_STRING, 203, "Blue (&B)"); menuPopup.TrackPopupMenu( TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, AfxGetMainWnd()); }
이 밖의 메뉴 및 관련사항 교재 pp 260 ~ 263 시스템 메뉴 가속기(=Accelerator, Hot Key) 트레이 아이콘 및 메뉴
상태바 (Status Bar)
상태바 (1/4) 상태바 MFC 클래스
상태바 (2/4) 상태바 리소스 static UINT indicators[ ] = { ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };
상태바 (3/4) 상태바 코드 class CMainFrame : public CFrameWnd { // 생략 ... protected: CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CChildView m_wndView; };
상태바 (4/4) 상태바 코드 (cont'd) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // 생략 ... if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) TRACE0("Failed to create status bar\n"); return -1; }
상태바에 정보 표시하기 상태바에 정보를 표시할 공간 마련 스트링 테이블 추가 상태바에 글쓰기 m_wndStatusBar.SetPaneText( 1 , “haha”); 구역 번호 상태바는 CMainFrame의 맴버변수로 존재 어떻게 CChildView에서 CMainFrame으로 갈 수 있을까?
상태바에 정보 표시하기 상태바에 정보를 표시할 공간 마련 스트링 테이블 추가 코드 내에서 매인프레임 포인터를 얻어오기 (CMainFrame *) AfxGetMainWnd() 얻어온 매인프레임을 통해 상태바에 접근 m_wndStatusBar (사전에 public으로 변경) 상태바에 글쓰기 m_wndStatusBar.SetPaneText(1, “haha”);
코딩 연습 마우스의 위치를 표시 1. status bar에 indicator 추가 2. WM_MOUSEMOVE 핸들러 추가 (CChildView) 3. SetPaneText 맴버함수 사용 위치 표시
코딩 연습 마우스의 위치를 표시 void CChildView::OnMouseMove(UINT nFlags, CPoint point) { CString str; str.Format("Mouse Position(%d, %d)", point.x, point.y); CMainFrame * pMain = (CMainFrame *) AfxGetMainWnd(); pMain->m_wndStatusBar.SetPaneText(1, str); CWnd::OnMouseMove(nFlags, point); }
TIP: debug 모드 활용법 Visual Studio의 2가지 Configurations: Release Debug 모드를 이용하여 compile F5 를 이용하여 실행 (Ctrl+F5 가 아님)
TIP: debug 모드의 장점 프로그램 실행 중 실시간 진단 가능 프로그램의 임시 중단 가능 (breakpoint) 임시 문자열 출력 (printf와 유사) 프로그램의 임시 중단 가능 (breakpoint) 변수 값 조회 현재 불리고 있는 함수의 경로
임시 문자열 출력 TRACE 함수 사용 Debug의 출력창(output)에 출력됨 마우스 위치 확인 예: 문법은 printf와 동일 Debug의 출력창(output)에 출력됨 마우스 위치 확인 예: TRACE ( … ); void CChildView::OnMouseMove(UINT nFlags, CPoint point) { TRACE("Mouse Position (%d, %d) \n", point.x, point.y); CWnd::OnMouseMove(nFlags, point); }
프로그램의 임시 중단 및 실행 추적 Breakpoint 사용: 변수 값 확인 실행 추적: F10/F11 지정/해제: F9 지역 변수 값 보여주기: Local (로컬) 지정한 변수 값 보여주기: watch (보기) 실행 추적: F10/F11
프로그램이 죽는 가장 큰 이유 메모리 에러 에러가 발생하면? 접근이 제한된 메모리로의 접근 대부분 배열의 범위의 문제 ex) a[-1]; Pointer의 잘못된 사용 에러가 발생하면? Debug 모드(F5)를 통해 다시 실행 Error가 발생하면 중단을 선택 Error의 원인을 파악 (Call Stack Check)
FILE I/O
개요 (1/2) 파일 입출력 방법 일반 파일 입출력 직렬화 CFile (파생) 클래스 Read(), Write() 등의 함수 이용 직렬화 CArchive 클래스 << 또는 >> 연산자 이용
개요 (2/2) MFC 클래스 계층도 파일 입출력 기능 제공 파생 클래스에 공통의 인터페이스 제공
CFile 클래스 핵심 입출력 연산 파일을 열거나 생성한다(Open). 파일 포인터의 위치에서 데이터를 읽는다(Read). 파일 포인터의 위치에 데이터를 쓴다(Write). 파일 포인터의 위치를 변경한다(Seek). 파일을 닫는다(Close).
CFile 로 파일 열기/생성 CFile file; file.Open( filename, mode, error ); 생성자를 이용한 파일 열기/생성 CFile file; file.Open( filename, mode, error ); CFile file ( filename, mode );
CFile 클래스 (1/6) CFile file; file.Open( filename, mode, error ); if( file.Open("mytest.txt", CFile::modeRead) == false) AfxMessageBox(_T(“Error”));
CFile 클래스 (1/6) CFile file; file.Open( filename, mode, error ); CFileException e; if(!file.Open("mytest.txt", CFile::modeReadWrite, &e)) e.ReportError();
CFile 클래스 (1/6) CFile file ( filename, mode ); 열기와 생성: 생성자의 사용 try { CFile file("mytest.txt", CFile::modeReadWrite); } catch (CFileException* e) e->ReportError(); e->Delete();
CFile 클래스 (2/6) 파일 접근/공유 모드 플래그 의미 CFile::modeCreate 파일을 무조건 생성한다. 같은 이름의 파일이 있다면 크기를 0으로 바꾼다. CFile::modeNoTruncate | 연산자를 이용하여 CFile::modeCreate 플래그와 더불어 사용하면 같은 이름의 파일이 있을 경우 크기를 0으로 바꾸지 않고 이 파일을 연다. CFile::modeRead 읽기 전용 모드으로 파일을 열거나 생성한다. CFile::modeReadWrite 읽기 및 쓰기 모드로 파일을 열거나 생성한다. CFile::modeWrite 쓰기 전용 모드로 파일을 열거나 생성한다. CFile::shareDenyNone 다른 프로세스에게 파일에 대한 읽기/쓰기를 허용한다. CFile::shareDenyRead 다른 프로세스에게 파일에 대한 읽기를 금지한다. CFile::shareDenyWrite 다른 프로세스에게 파일에 대한 쓰기를 금지한다. CFile::shareDenyExclusive 다른 프로세스에게 파일에 대한 읽기/쓰기를 금지한다.
CFile 클래스 (3/6) 파일 닫기: 소멸자에서 자동으로 닫아준다 void CExFileView::OnLButtonDblClk(UINT nFlags, CPoint point) { CFile file; CFileException e; if(!file.Open("mytest.txt", CFile::modeReadWrite| CFile::modeCreate, &e)){ e.ReportError(); return; } // 생략 ... } // -> CFile::~CFile() 함수가 호출된다.
CFile 클래스 (4/6) 닫기: Close 맴버 함수 이용 한 객체로 여러 파일을 다룰때 void CExFileView::OnLButtonDblClk(UINT nFlags, CPoint point) { CFile file; CFileException e; if(!file.Open("mytest.txt“, CFile::modeReadWrite|CFile::modeCreate| CFile::modeNoTruncate, &e)) e.ReportError(); return; } file.Close();
CFile 클래스 (5/6) 읽기와 쓰기 파일 포인터 위치 변경 UINT CFile::Read (void* lpBuf, UINT nCount) ; void CFile::Write (const void* lpBuf, UINT nCount) ; ULONGLONG CFile::Seek (LONGLONG lOff, UINT nFrom) ; nFrom 의미 CFile::begin 파일의 처음 위치부터 lOff만큼 파일 포인터 이동 CFile::current 현재의 파일 포인터 위치부터 lOff만큼 파일 포인터 이동 CFile::end 파일의 끝 위치부터 lOff만큼 파일 포인터 이동
CFile 클래스: 변수 저장 void CFile::Write (const void* lpBuf, UINT nCount) ; CFile file(_T(“test.txt“), CFile::modeRead); int a; int b; file.Write(&a, sizeof(a)); file.Write(&b, sizeof(b));
CFile 클래스: 변수 읽기 UINT CFile::Read (void* lpBuf, UINT nCount) ; CFile file; CFileException e; if(!file.Open("test.txt", CFile::modeRead, &e)){ e.ReportError(); return; }; int a,b; file.Read(&a, sizeof(a)); file.Read(&b, sizeof(b)); CString str; str.Format("a=%d b=%d", a, b); AfxMessageBox(str);
CFile 클래스 (6/6) 기타 함수 CFile::GetLength(), CFile::SetLength() 파일의 현재 크기를 얻거나 변경한다. CFile::GetPosition() 현재의 파일 포인터 위치를 얻는다. CFile::LockRange(), CFile::UnlockRange() 파일의 일정 영역을 잠그거나 해제한다. 잠근 영역은 다른 프로세스가 접근할 수 없다. CFile::GetFilePath(), CFile::GetFileName() 파일의 전체 경로(Full Path)와 이름을 얻는다.
CMemFile 클래스 메모리 속에 가상의 파일을 만들어 줌 void CExFileView::OnLButtonDblClk(UINT nFlags, CPoint point) { CMemFile file; // 메모리 파일에 쓰기 int a = 100; file.Write(&a, sizeof(a)); // 메모리 파일에서 읽기 file.SeekToBegin(); int b; file.Read(&b, sizeof(b)); TRACE("b = %d\n", b); }
CStdioFile 클래스 (1/2) Text 파일을 읽고 열 때 쓰는 것 문자열을 읽어오는 함수: ReadString 문자열을 기록하는 함수: WriteString CString str; file.ReadString(str); CString str =_T(“Output”); file.WriteString(str);
CStdioFile 클래스 (2/2) 문자를 읽어서 대문자로 바꿔 저장하는 예 CStdioFile file1; file1.Open("test1.txt", CFile::modeRead); CStdioFile file2; file2.Open("test2.txt", CFile::modeWrite|CFile::modeCreate); CString str; while(file1.ReadString(str)) { str.MakeUpper(); file2.WriteString(str + "\n"); }
CFileFind 클래스 (1/2) 로컬 디스크에 대한 파일 검색 제공 MFC 클래스 계층도 사용법 FineFile() 맴버 함수 사용 MFC 클래스 계층도 CFileFind finder; bool bExist = finder.FindFile(“MyText.txt”);
CFileFind 클래스 (2/2) 사용 예: 현재 디렉토리의 모든 파일을 보여줌 CFileFind finder; 사용 예: 현재 디렉토리의 모든 파일을 보여줌 CFileFind finder; BOOL bWorking = finder.FindFile("*.*"); while(bWorking) { bWorking = finder.FindNextFile(); if(finder.IsDirectory()) TRACE("[%s]\n", (LPCTSTR)finder.GetFileName()); else TRACE("%s\n", (LPCTSTR)finder.GetFileName()); }