컴퓨터 공학 설계 및 실험 I MFC programming 8주차 실험 MFC Programming Dept. of CS, Sogang Univ.
Programming with Visual Studio 프로그래머가 사용하기에 매우 쉽다. 윈도우 내부 동작에 대한 이해 없이도 프로그래밍을 할 수 있다. C++혹은 C라는 언어를 이용하여 프로그램을 쉽게 개발할 수 있도록 해주는 환경(컴파일러, 에디터, 디버거, 라이브러리 등)을 제공한다. Dept. of CS, Sogang Univ.
Visual Studio의 구성 Visual Studio의 작업 영역 프로젝트 뷰 에디터 영역 아웃풋 영역 Dept. of CS, Sogang Univ.
Visual Studio의 구성 프로젝트뷰 영역 프로젝트를 구성하고 있는 여러 요소들을 일관성 있게 살펴볼 수 있도록 해준다. 아래의 세 가지 형태의 뷰를 제공한다. 클래스뷰(Class View) : 소스 코드를 C++ 클래스 수준에서 살펴보고 조작할 수 있게 해준다. 리소스부(Resource View) : 애플리케이션에서 사용하는 여러 가지 리소스인 다이얼로그 박스, 아이콘, 메뉴 등을 찾아서 편집할 수 있도록 해준다. 파일뷰(File View) : 애플리케이션을 만드는 데 필요한 모든 파일을 찾아볼 수 있게 해준다. Dept. of CS, Sogang Univ.
<Solution Explorer> <Resource View> Visual Studio의 구성 프로젝트뷰 영역의 세가지 내용 <Solution Explorer> <Class View> <Resource View> Dept. of CS, Sogang Univ.
Visual Studio의 구성 에디터 영역 아웃풋 영역 Visual C++ 를 사용하면서 필요한 모든 편집을 할 수 있는 곳 아래의 에디터를 이 영역에서 사용가능 C++혹은 C 소스코드를 편집할 수 있는 코드 에디터 다이얼로그 박스를 그릴 수 있는 다이얼로그 에디터 아이콘을 그릴 수 있는 아이콘 에디터 아웃풋 영역 컴파일 진행 과정 시 발생하는 경고 메시지, 에러 메시지 등을 볼 수 있다. Visual C++ 디버거(Debugger)를 실행시켰을 경우에는 실행중인 모든 변수들의 값도 볼 수 있다. 6
Visual Studio의 구성 Visual Studio 생성 파일 프로젝트 하나의 프로그램을 만들 때 필요한 모든 구성요소들에 관한 정보를 갖는다. 어떤 파일들이 컴파일되고 링크되어 실행파일을 만들어낼 것인가에 대한 정보를 갖는다. 프로젝트 파일 : vcproj 솔루션 프로젝트 및 워크스페이스가 한 단계 발전된 형태 프로젝트의 모든 정보를 포함함과 동시에 작업 윈도우의 여러 가지 설정 상태 및 윈도우의 위치 등 개발 환경에 대한 정보까지 갖는다. 솔루션 파일 : sln 7
Visual Studio의 구성 Visual Studio 생성 파일(Cont’) 프로젝트를 구성하고 있는 관련 파일들 파일 확장자 설명 .h 헤더 파일 (클래스 정의 파일) .cpp / .c 소스 파일 .clw Class Wizard에서 사용되는 정보를 보관하는 파일 .sln 솔루션 파일 .dsp 프로젝트 파일 .rc Resource가 정의된 파일 .pch 프리 컴파일 헤더 파일 .pdb 프로그램 정보 파일 .res .rc 파일이 컴파일된 바이너리 파일 Res폴더 리소스에 사용되는 이미지를 비롯한 기타 등등의 파일이 저장된 폴더 Debug 폴더 컴파일 후에 생성되는 파일(.obj, .pch, .exe 등)이 들어 있는 폴더 8
MFC 등장 배경 운영체제의 발전 구조적 프로그래밍 기법의 한계 윈도우용 응용 프로그램 개발 환경의 비효율성 16비트 텍스트 기반의 DOS에서 32비트 윈도우 기반 운영체제로 전환. DOS 운영체제에서는 대부분의 응용 프로그램이 텍스트 기반 프로그램. 윈도우 운영체제로 넘어오면서 그래픽 기반(윈도우 형태) 프로그램으로 전환. 구조적 프로그래밍 기법의 한계 개발되어지는 응용 프로그램의 규모가 크고 복잡해짐. 기존의 C언어에 의한 구조적 프로그램밍 기법이 한계를 드러냄. C++에 의한 객체지향 프로그래밍 기법이 해결책으로 제시됨. 윈도우용 응용 프로그램 개발 환경의 비효율성 SDK(Software Development Kit : 윈도우 프로그래밍을 위해 제공되는 툴과 라이브러리로 구성된 소프트웨어 패키지)를 이용한 윈도우 프로그래밍 환경. DOS 프로그래밍을 하던 것처럼 프로그래머 자신이 처음부터 끝까지 프로그램의 코드를 작성하는 방식이기 때문에 생산성이 떨어지고 비효율적임. Dept. of CS, Sogang Univ.
MFC MFC(Microsoft Foundation Class)란 MFC 프로그래밍 Microsoft의 Visual C++ 컴파일러와 함께 제공되어지는 윈도우 응용 프로그램 제작을 위한 C++ 클래스 라이브러리. SDK에서 C 함수 형태로 제공되는 기능을 C++ 클래스 형태로 포장해서 객체지향 프로그래밍을 할 수 있도록 함. 1992년 MS C/C++ 7.0 출시와 함께 최초 버전의 MFC 1.0 등장 이후 계속적으로 클래스들이 추가되고 있음. MFC 프로그래밍 기본적인 소스코드를 생성해주고 사용자는 최소한의 코드만을 작성. 코드의 확장이 쉽다(extensibility). 코드를 다시 사용할 수 있다(reusability). 유지보수하기가 편리하다(maintenability). 현재 세계적으로 널리 쓰이고 있는 대부분의 상용 프로그램들이 MFC를 이용하여 만들어지고 있음. Dept. of CS, Sogang Univ.
MFC 라이브러리 MFC 라이브러리의 구성(MFC Library Hierarchy) MFC에는 Window application의 뼈대를 이루는 클래스, 그래픽 관련 클래스, 자료구조 클래스 및 파일 관련 클래스 등 약 300여 가지의 클래스가 계층구조로 제공됨. 기반클래스 : MFC 대부분의 클래스가 상속받는 클래스 그래픽 클래스 : 그래픽 기능을 지원하기 위한 클래스 CObject CCmdTarget CWinTread CWinApp CDocument CWnd CFrameWnd CView CDialog CControlBar 그 이외의 클래스 CFile CDC CGdiObject CMenu CDatabase CDaoDatabase CAsyncSocket CArray CList CMap CInternetSession CInternetConnection CFileFind CGopherLocator 인터넷 관련 클래스 : 인터넷을 이용한 애플리케이션 개발을 위한 클래스 AFX 클래스 : MFC 모든 프로그램이 공통적으로 수행하는 기능들을 구현해 놓은 클래스 윈도우 클래스 : 윈도우 오브젝트를 구현한 클래스 데이터베이스 클래스 : 데이터베이스에 데이터를 저장하고 관리하는 클래스 자료구조 클래스 : 자료구조와 관련된 클래스 Dept. of CS, Sogang Univ.
위의 세 오브젝트를 묶어주고, 프로그램을 구동시킴(눈에는 안 보임) MFC의 AFX 클래스 AFX(Application Frameworks) 클래스 모든 응용 프로그램들이 공통적으로 수행하는 기능들을 구현해 놓은 것으로, MFC로 작성된 프로그램의 뼈대를 이루는 클래스 CFrameWnd : 프로그램 외곽 윈도우 프레임을 관리하는 기능의 클래스 CView : 데이터를 보여주는 윈도우를 관리하는 기능의 클래스 CDocument : 데이터를 저장하고 처리하는 기능의 클래스 CWinApp : 프레임 윈도우, 뷰, 도큐먼트를 묶어주고, 프로그램을 구동시켜 주는 역할을 하는 클래스 CFrameWnd CView CDocument 윈도우의 프레임을 관리 데이터를 보여주는 윈도우 데이터를 저장, 처리(눈에는 안 보임) CWinApp 위의 세 오브젝트를 묶어주고, 프로그램을 구동시킴(눈에는 안 보임) Dept. of CS, Sogang Univ.
MFC의 Document/View 구조 도큐먼트 클래스와 뷰 클래스로 분리한 이유 기능을 분리하고 클래스 역할을 분담시킴으로서 각 클래스 구현을 단순화. 같은 데이터라도 보여주는 방법이 다양함. 도큐먼트 클래스는 데이터를 처리/저장하는 역할. 뷰 클래스는 도큐먼트 클래스로부터 데이터를 가져와 화면에 보여주는 역할. GetFirstView () GetNextView UpdateAllViews GetDocument OnDraw OnUpdate 데이터를 처리하고 저장하는 기능 표시함 CDocument CView Dept. of CS, Sogang Univ.
MFC의 Document/View 구조 도큐먼트와 뷰 객체간 상호작용을 위한 함수들 View 객체에서 쓰이는 함수 GetDocument() : Doc 객체 포인터 반환 OnInitalUpdate() : 뷰의 초기화 작업을 위해 사용(뷰의 특정 변수 초기화 등) OnDraw() : View 객체와 연결된 Doc 객체의 내용을 화면에 출력 OnPrint() : Doc 객체의 내용을 프린터로 출력 OnPrepareDC() : OnDraw(), OnPrint() 함수 호출 전에 호출 OnBeginPrinting() , OnEndPrinting() Docment 객체에서 쓰이는 함수 GetNextView() : 뷰 리스트에서 다음 뷰를 얻어옴 GetFirstView() : 뷰 리스트에서 첫번째 뷰를 얻어옴 UpDateAllViews() : Doc 객체의 데이터가 변경되면 화면에 다시 뿌림 SetModifiedFlag() : Doc 객체의 데이터가 변경되었음을 표시 DeleteContents() : Doc 객체가 닫힐 때 마무리 작업(할당된 메모리 삭제 등) Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig <Solution Explorer> <Class View> <Resource View> Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig AppWizard에 의해 생성된 내용(Single Document Interface인 경우) 기본적으로 AppWizard가 만들어놓은 AFX 클래스의 파생클래스들을 갖는다. MFC 기반 클래스 파생 클래스 CObject CCmdTarge CWinApp CWaterfallApp CDocument CWaterfallDoc CWnd CFrameWnd CMainFrame CView CWaterfallView CDialog Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig CWaterfallApp 전체 프로그램 관리 하는 클래스 프로그램 초기화, 메시지 루프 include, 프로그램 종료 메인 프레임, 뷰, 도큐먼트 객체와 리소스를 유기적으로 연결 CMainFrame 프로그램의 메인 윈도우 관리 메뉴, 툴바가 위치한 non-client 영역 관리 CWaterfallDoc 뷰에 출력되는 데이터 보관 디스크에 데이터 저장 및 로드 CWaterfallView 클라이언트 영역(뷰 윈도우)을 관리 도큐먼트 객체의 데이터를 화면이나 프린터에 출력 CView CMainFrm CDocument CWinApp Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig AppWizard에 의해 생성된 내용(Dialog Based인 경우) MFC 기반 클래스 파생 클래스 CObject CCmdTarge CWinApp CTreeCheckApp CDocument CWnd CFrameWnd CView CDialog CTreeCheckDlg Dept. of CS, Sogang Univ.
AppWizard를 이용한 MFC Programmnig CTreeCheckApp 전체 프로그램 관리 하는 클래스 프로그램 초기화, 메시지 루프 include, 프로그램 종료 다이얼로그 박스와 리소스를 유기적으로 연결 CTreeCheckDlg 다이얼로그 박스 오브젝트를 표현하는 클래스 다이얼로그 박스를 처리하는데 필요한 기능 구현 Dept. of CS, Sogang Univ.
MFC 프로그램의 작동 원리 프로그램의 실행되면 CWinApp 클래스의 InitInstance() 함수에서 도큐먼트 클래스, 프레임 윈도우 클래스, 뷰 윈도우 클래스를 등록시킨 후, 프레임 윈도우를 호출하여 보여준다. 시작 BOOL CMyApp::InitInstance() { CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyDoc), // 도큐먼트 클래스 등록 RUNTIME_CLASS(CMainFrame), // 프레임 윈도우 클래스 등록 RUNTIME_CLASS(CMyView)); // 뷰 윈도우 클래스 등록 AddDocTemplate(pDocTemplate); return TRUE; } InitInstance() Run() 무한루프 ExitInstance() 종료 < CWinApp 클래스 > Dept. of CS, Sogang Univ.
MFC 프로그램의 작동 원리 무한루프 상태에서 메시지를 기다리다가 메시지를 받으면 해당 메시지에 맞는 윈도우에게 메시지를 전달하여 작업을 수행토록 함. 윈도우 메세지 발생하는 상황 WM_CREATE 윈도우가 생성될 때 시작 WM_ACTIVATE 윈도우가 활성 또는 비활성 될 때 WM_PAINT 윈도우가 다시 그려져야 할 때 InitInstance() WM_MOUSEMOVE 윈도우 위에서 마우스가 움직였을 때 … … Run() 무한루프 { while(msg != WM_QUIT){ switch(msg){ case WM_CREAT: OnCreate(); break; case WM_ACTIVATE: OnActivate(); case WM_PAINT: OnPaint(); … } WM_MOUSEMOVE ExitInstance() 운영체제에 의해 메세지들이 차례로 메시지 큐에 추가됨 종료메세지(WM_QUIT)를 만날 때까지 메세지큐에서 하나씩 꺼내서 처리 종료 WM_PAINT < CWinApp 클래스 > WM_ACTIVATE 메시지 큐 WM_CREATE Dept. of CS, Sogang Univ.
MFC 프로그램의 작동 원리 만약, 사용자가 프로그램을 종료시키면 CWinApp 클래스의 ExitInstance() 함수에서 자신이 관리하는 모든 객체들을 소멸시키고 사용된 자원들을 반환한 후, 자신도 소멸시킨다. 시작 InitInstance() Run() 무한루프 ExitInstance() 종료 < CWinApp 클래스 > Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I Tree Check 문제 노드의 집합 V와 이에 대한 방향간선의 집합 E가 주어졌을 때 G=(V,E)가 Tree인지 아닌지를 결정하는 프로그램을 작성. G=(V,E)가 Tree가 될 수 있기 위한 조건 1. V에는 정확히 하나의 predecessor가 없는 노드가 존재한다(root). 2. Root를 제외한 모든 노드는 정확히 하나의 predecessor를 갖는다. 3. Root로부터 각 노드까지는 정확히 하나의 경로(path)가 존재한다. 예: Tree Tree Non-Tree Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I 입력 입력은 여러 개의 테스트 케이스로 구성되며 입력의 첫 정수는 테스트 케이스의 수를 나타낸다. 각 테스트 케이스의 첫 줄에는 간선들의 개수가 표시되고 이어 그만큼의 간선에 대한 정보가 정수 쌍으로 주어진다. 정수 쌍의 처음 정수는 방향간선의 시작 노드를 나타내고 두 번째 정수는 그 노드의 successor이다. 노드 번호는 항상 0보다 크며 간선의 멤버로 한번이상 포함된다고 가정한다. 예: 3 5 8 3 4 6 5 8 4 2 5 4 7 7 1 7 5 1 6 5 9 7 4 7 2 7 3 6 8 6 6 5 6 2 6 3 8 4 2 4 테스트 케이스 수 쌍들의 수 정수쌍 노드의수는 최대 99개로 제한한다. 즉, 노드번호는 1-99까지. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I 출력 프로그램을 수행하면 아래에 보인 대화상자가 나타나도록 한다. 대화상자 사용법 ‘File’ 버튼 : 입력 파일을 검색하여, 이를 입력 받는다. ‘Check’ 버튼 : 클릭할 때마다 입력된 테스트에 대한 검사를 순서대로 수행하여 트리 여부를 ‘RESULT’창에 출력한다. ‘Exit’ 버튼 : 프로그램을 종료한다. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I MFC AppWizard를 사용하여 대화상자 기반 프로그램 틀을 생성한다(교재 3-4, pp. 162-165). 대화상자 편집 교재 3-5(pp.166-170)의 과정을 통하여 대화상자를 편집한다. ‘File’, ‘Check’, ‘Exit’ 버튼 각각에 대한 멤버 함수와 멤버 변수를 추가하는 과정을 교재에서 기술한 단계에 따라 수행한다. 멤버 함수 : TreeCheckDlg.cpp에 template가 생성된다. OnExit OnFileOpen OnCheckTree Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I Tree Checking(Idea) 입력 그래프의 노드는 0보다 큰 정수로 표시. 이러한 정수의 최대 값을 N 이라고 하면 N+1 개의 정수 배열 P[ ]를 마련하여 이를 –1로 초기화. 각 간선 <x, y>에 대하여 다음을 수행 : non_tree_flag이 set되어 있거나 0으로 세팅된 노드가 둘 이상 있으면 트리가 아니다. 나머지 세부적인 사항은 교재를 참고한다. if ( P[x] == -1 ) P[x] = 0; // membership setting if ( P[y] <= 0 ) P[y] = x; // predecessor setting else set non_tree_flag; // has more than one predecessors Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I 추가 체크 사항 앞에서 조사한 사항 즉, predecessor의 수가 root를 제외하고 모두 1이고 P[]=0인 노드가 단 하나만 존재하여도 tree가 아닌 경우가 있다. 예: 따라서, cycle이 존재하는지를 추가로 조사하는데 아래의 함수를 사용한다. 1 5 4 2 3 bool Cycle_Check ( int P[] ) { int flag[NODE_MAX_NUM], i, j; for(j = 0; j < NODE_MAX_NUM; j++){ if (P[j] <= 0 ) continue; for(i = 0; i < NODE_MAX_NUM; i++) flag[i] = -1; if ( dfs ( P, flag, j ) == true ) return true; // a cycle exists } return false; // no cycle bool dfs ( int P[], int flag[], int c){ flag[c] = 1; if ( P[c] == 0 ) return false; // no cycle else if ( flag[P[c]] == 1 ) return true; // cycle detected else return dfs(P, flag, P[c]); } NODE_MAX_NUM = 100. P[] : Predecessor 어레이. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming I 프로그램 작성 교재의 내용을 참조하여 작성한다. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II Water Fall 문제 물받이용 선반이 벽면에 임의로 놓여있을 때 물이 떨어져 흐르는 경로를 계산하여 화면에 나타내는 문제. 예 : 물받이를 선분으로 표시하고 다음과 같은 가정을 한다. 1. 주어진 각 선분은 서로 교차하지 않는다. 2. 선분들의 양 끝점의 y 좌표는 모두 0보다 크다. 즉, 모든 선분은 x 축 위에 있다. 3. 물이 선분의 끝에 도달하면 바로 떨어진다고 가정한다. 즉, 관성의 법칙은 무시한다. 4. 각 점은 임의의 위치에 존재할 수 있다(단, x-축 제외). 즉, 구멍이 천장뿐 아니라 벽면에도 있을 수 있다고 가정한다. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 입력 첫 번째 줄은 주어진 선분의 수 N(≥0)이다. 두 번째 줄부터 N 개의 줄에는 각 선분의 양 끝 좌표가 xl, yl, xr, yr 순으로 표시된다. 여기서 (xl, yl)과 (xr, yr)은 각각 선분의 왼쪽과 오른쪽 끝 좌표이다. 선분에 대한 자료 다음 줄에는 점의 수 M이 주어지고 그 다음 줄부터 M 개의 점의 좌표 (x, y) 가 M 개의 줄로 표시된다. 만일 N=0인 경우 아무런 선분이 없다는 의미이고 따라서 바로 다음에 M이 표시되게 된다. 예: 6 14 7 3 4 11 13 16 11 1 10 6 7 2 1 4 3 16 17 22 13 12 5 23 3 4 10 4 14 14 2 13 19 8 선분의 수 선분 점의수 점 Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II Exit 출력: 다음과 같은 윈도우를 생성하여 출력한다. Exit File Open Select Dropping Point (Mark Red) Draw Waterfall Trajectory Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 출력: 파일 읽기를 Click한 후 입력 파일을 읽은 직후 Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 출력: 를 누를 경우 물의 시작점이 빨강색으로 표시된다(누를때 마다 차례로 표시). Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 출력: 를 누르면 현재 빨강색으로 표시된 지점으로부터 물의 흐름을 표시한다. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 문제해결방법 시작점 및 선분의 자료구조(좌표를 배열에 저장) 시작점의 집합 S={s1, s2, …} 선분의 집합 P={p1, p2, …} Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 문제해결방법 물흐름 경로 구하기 1. S에서 현재 활성화된(빨강색) 점 si를 가져온다. C = si. 2. C의 아래로 C와 y 축으로 가장 가까운 거리에 있는 선분 pj를 P에서 구한다. 3. 선분 pj의 최소 Y 좌표 점으로 C값을 변경한다. 4. 위의 단계 2, 3를 C가 X축에 닿을 때 까지 반복적으로 수행한다. 위의 과정에 의하여 얻어지는 물흐름 자취를 linked list로 저장한다. 물 흐름 경로를 그리는데 사용. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II 윈도우 및 버튼 생성 교재에서 설명하는 내용대로 생성한다. 함수작성 다음과 같은 함수를 작성한다. 문제를 푸는 함수 F1. 초기화 함수 : 새로운 입력 파일을 처리하게 전에 전역 변수를 초기화 하고, 배열, 리스트 등을 청소하는 함수이다. F2. 파일 읽기 함수: 파일로부터 입력 자료를 읽어 들여 S와 P를 구성하는 함수이다. F3. 물 흐르는 경로 만드는 함수 : 입력 자료를 토대로 선택된 시작점의 경로를 만들어 linked list를 구성하는 함수. 윈도우에 그리는 함수 F4. 배경을 그리는 함수 : 입력 데이터인 선분과 시작점을 화면에 그리는 함수 F5. 선택된 시작점을 그리는 함수 : 선택된 시작점의 경우 다른 시작점과 다른 색으로 그려 그 시작점을 알 수 있다. 을 누름에 따라 시작점이 차례로 선택되어야 하므로 현재 선택된 시작점의 S에서의 index를 기억하여 두어야 한다. F6. 물 흐르는 경로를 그리는 함수 : F3에 의하여 만들어진 linked list를 이용하여 물 흐름을 윈도우에 그린다. Dept. of CS, Sogang Univ.
WIN-2 기초 MFC Programming II void CWaterfallView::OnDraw(CDC* pDC) 환경이 바뀌면 항상 호출되는 함수이다. 이 함수 내에서 배경 그리기 함수 F4, 선택된 시작점 그리기 함수 F5, 물 흐름 그리기 함수 F6를 차례로 호출한다. 그림은 화면에 항상 덮어 쓴다. 시작점이 선택되지 않았거나 또는 물 흐름 경로가 계산되어 있지 않은 경우 아무 것도 그리지 않도록 한다. Invalidate(true) 이 함수는 강제로 OnDraw를 호출하게 하는 함수 이다. 파일을 읽었을 때, 시작점을 선택하였을 때 그리고 물 흐름 경로를 구하였을 때 이를 호출하여 그림이 새로 그려지도록 한다. 나머지 사항 교재를 참고한다. Dept. of CS, Sogang Univ.