본문으로 바로가기

Day-16 MFC이야기와 실습1

category Programming/TIPS 17기 2017. 8. 20. 12:45

 

 

 

MFC

 

MFC는 주로 CObject, CWinApp, CWnd 3개의 클래스로 이루어져있다.

 

CWinApp 상속을 받아 자기만의 CMyApp 클래스가 상속 받는다. --- 상속을 받는 이유는 메인 함수를 만드는 InitInstance 함수가 비워져 있다.

InitInstance 함수를 오버라이드 해야한다. 메인 윈도우 만드는 작업을 해야한다.

 

CWnd --- 모든 윈도우를 대표하는 클래스이다. 윈도우와 관련된 모든 내용을 CWnd 클래스가 가지고 있다. CMyWnd가 상속 받는다. CWnd는 이미 정해져 있는 틀이다. 자신의 마음대로 사용하고 싶으면 상속을 받고 오버라이딩 해야한다.

CWnd를 상속받은 CDialog 클래스가 있다. CWnd 클래스보다 몇가지 기능이 더 추가되어있다.

 

c

 

CToolBar + CView + CStatusBar를 모두 관리하는 CFrameWnd 클래스를 제공한다. CFrameWnd 클래스는 CWnd 클래스가 상속받는다.

 

SDI란? --- CWinAPP, CFrameWnd, CView를 뜻한다.

 

파일 입출력에 대한 클래스 --- CDocument(과거에는 필수였지만 현재는 필수가 아닌 옵션이다.)

 

메모장은 SDI로 만들어 졌다. 단일창이라는 뜻이다.

프로그램속 또 다른 프로그램을 MDI라고 한다. 다중창이라는 뜻이다.

 

처음(RAM이 부족할 때)에는 간단한 프로그램은 SDI, 복잡한 프로그램은 MDI로 하라고 권장했다. MDI는 SDI에 비해 굉장히 어려워서 MDI로 프로그래밍하기 어렵다. RAM 용량이 커짐에 따라 SDI가 여러 개이면 MDI라는 인식이 펼쳐졌다. SDI를 많이 사용하면 아래가 지저분해지기 때문에 탭이라는 기능이 생겼다.

 

이제 MFC 실습을 해보자.

 

간단한 오목 프로그램 만들기 실습을 해보자.

 

실습을 하기 위해서 MFC 프로젝트를 만들어야한다. 아래와 같이 따라해보자.

 

 

 

MFC 응용 프로그램을 선택한다. 위치는 공백 없고 한글 없이 하는 것이 좋다. 버그가 발생할 수 있기 때문이다. 솔루션 디렉터리 만들기도 버그가 생길 수 있기 때문에 클릭해야한다. 만약 MFC 응용 프로그램이 없다면 Open Visual Studio Installer을 클릭한 후에 추가 설치해야 한다.

 

 

 

응용 프로그램 종류에서 대화 상자 기반을 클릭한다. 이후 SDL 체크를 해제하자.

단일 문서는 SDI를 가리키고, 다중 문서는 MDI를 가리킨다.

 

SDL 검사란??

 

 

strcpy 함수는 메모리 침범에 대해 상관하지 않는 함수이다.

하지만 strcpy_s라는 함수를 만들어 옵션으로 [크기]를 더 명시해 메모리 침범에 대비한다. 제약이 더 걸리는 대신 속도가 느려진다. 이런한 것을 SDL이라고 한다. 초보자들이 더 안전하게 사용할 수 있다.

 

 

 

두꺼운 프레임, 시스템 메뉴, 정보 상자가 체크 되어 있다. 시스템 메뉴를 제외한 두꺼운 프레임과 정보 상자는 체크를 해제하자.

 

 

 

고급 기능의 모든 기능을 해제하자.

 

 

 

App와 Dlg 클래스가 생성되는것을 확인하고 마침을 눌러 프로젝트를 생성하자. 프로젝트를 정상적으로 생성했으면 아래와 같은 하면이 나온다.

 

 

"TODO : 여기에 대화 상자 컨트롤을 배치합니다."는 필요 없는 항목이기 때문에 지워도 된다.

 

 

위 처럼 속성 탭을 클릭한 후 FONT를 바꾸어주자.

 

 

 

굴림으로 글꼴을 위와 같이 바꿀 수 있다. 굴림과 굴림체를 구분하지 못하는 경우가 많다. 굴림은 글자마다 폭이 다르다. 체(굴림체)가 붙은 글꼴은 모든 글자 폭이 같다. 즉, 여백과 간격이 일정하다는 것이다.

 

 

위 코드는 사용할 최소한의 코드만 남긴 코드이다. 위 소스 코드에서 빌드를 한후 디버깅을 하면 아래의 화면 같이 나온다. Omock.cpp 소스 코드이다.

 

 

OnPaint() --- WM_PAINT가 발생하면 자동으로 처리한다. On이라는 접두어가 붙으면 "처리기"라는 뜻이다. WM대신 On이 붙는다. 즉, PAINT 처리기 라는 뜻이다.

if (IsIconic()) --- 최소화 되었을 때 처리하는 작업이다. 사용할 필요가 없어 왼쪽의 "-"를 클릭해 접어둔다.

 

 

 

우선 바둑판을 그려야한다. 바둑판은 19 x 19이다. 사각형을 먼저 그리면 18개만 그리면 된다.

 

 

사각형을 두가지 방식으로 그릴 수 있다 아래의 소스 코드 중 주석을 한 부분과 주석을 하지 않은 부분을 비교해보자.

 

 

테두리는 가는선, 속은 굵은선이 되는 이유???

 

(30, 30), (60, 60)

 

30 ~ 79까지 간다. 새로운것은 80부터 시작한다. 따라서 주석을 한 부분과 같이 하면 끝 점과 시작 점이 같기 때문에 겹쳐져서 그려진다.

 

이제 클래스 마법사를 이용해 보다 편리하게 클래스를 추가해보자.

 

프로젝트 -> 클래스 마법사를 클릭하자

 

아래와 같이 따라하면 쉽게 클래스를 추가할 수 있다.

 

 

 

아래 소스 코드가 추가된 부분이다.

 

 

 

오목을 하기 위해서 바둑돌을 놓아야 한다. 따라서 원을 그려 클릭할 때 원이 그려지도록 해보자.

 

 

위와 같이 소스 코드를 작성한 후 디버깅 해보면 아래와 같이 원을 그려 놓을 수 있다.

 

 

하지만 문제점이 생긴다. 첫째는 바둑돌이 흰색만 놓인다. 또한 바둑판의 가운데에 놓이지 않고 선에 놓인다. 바둑판 외부에도 돌을 놓을 수 있다.

이러한 문제점을 해결해보자.

 

일단 바둑돌을 흰색, 검은색이 교대로 나오도록 소스 코드를 수정하자.

 

우선 Omock을 클릭한 후 Ctrl + KO or F12를 누르면 헤더파일로 이동할 수 있다. 헤더파일로 이동하자.

 

헤더파일에서 아래와 같은 부분을 추가해주자.

 

 

OmockDlg.cpp 파일로 이동해서 추가적으로 소스코드를 수정하자.

 

 

이렇게 수정하고 디버깅을 하면 검은돌과 흰돌이 번갈아 나온다.

 

 

이제 돌을 제 자리에 놓는 프로그램을 구현하기 위해 소스 코드를 조금 더 수정하자. 우선 소스코드로 이동하자.

 

 

OmockDlg.cpp 파일에서 아래처럼 수정해주자.

 

 

위와 같이 수정하고 디버깅을 하면 아래와 같이 제자리에 바둑돌이 놓이는 것을 볼 수 있다.

 

 

하지만 이렇게 소스 코드를 작성하더라도 윈도우 밖으로 윈도우 창이 나가면 바둑돌의 위치를 기억하지 못해 복구할 수 없다.

따라서 복구하는 소스 코드를 작성하면 아래와 같이 작성할 수 있다.

 

 

최종적인 오목 소스코드는 아래와 같다.

 

 

'Programming > TIPS 17기' 카테고리의 다른 글

Day-17 MFC 이야기와 실습2  (0) 2017.08.29
Day-15 Win32 API 이야기와 실습2  (0) 2017.08.17
Day-14 Win32 API 이야가와 실습1  (0) 2017.08.15
Day-13 C++ 이야기3  (0) 2017.08.14
Day-12 C++ 이야기2  (0) 2017.08.11