MFC는 비쥬얼 스튜디오에서 제공하는 멀티미디어 처리 프로그램이며 문법은 거의 C++로 이뤄져있는것 같다.
아직 배우는 중이라 C++이라고 단언할 수는 없지만.. 어쨋든 객체지향이므로 일일이 직접 코딩하는 수고를 덜 수 있다.
문저 새 프로젝트를 만드는 법부터 차근차근 보도록 하겠다.
새 프로젝트를 클릭하면 다음과 같은 화면이 등장하는데 각각이 무엇을 의미하는지 살펴보자.
SDI 단일문서(메모장, 그림판 등등.. 하나의 프로세스가 하나의 폼만 띄우는 형태)
MDI 다중문서(비주얼 베이직에서 폼을 여러개 띄우는것이 좋은 예)
Dialog 기반(대화상자 기반, 계산기 등)
...어쨋든 별로 중요한건 아닌것 같고 대부분의 응용 프로그램들은 거의 SDI 형태로 되어 있기는 하다.
MFC마법사를 이용하여 클래스를 생성한다. 4개의 클래스가 생성된다^-^
(x는 내가 지정한 이름임)
xView : 뷰에 관련된 클래스(예를 들면 메모장의 본문 작성하는 구간처럼 보여주는 공간.) 말 그대로 주로 화면 출력에 관련됨.
XMainFrame : 메뉴 및 메뉴바, 프레임폼 등
xDOC : 데이터 처리를 여기다 하면 용이함
xAPP : 운영체제로부터 메세지를 받고 프로세스를 죽이는 등, 응용프로그램 자체를 나타냄(내가 건드릴 일은 거의 없을듯)
이제 프로젝트 > 클래스 마법사를 클릭하여 멤버 변수를 추가하는 연습을 해보겠다.
물론 직접 우측상단의 클래스뷰를 통해서 들어가는 방법도 있지만 모처럼 MFC라는 "툴"을 사용하는 실습이니 편하게 가겠다.
레나 그림을 로드하려면 메모리 공간이 필요하므로
메모리 공간을 만들기 위해 변수를 일단 DOC클래스에 생성해 준다. 위에 언급했듯 DOC클래스는 데이터 처리를 위한 클래스이다.
변수 추가한뒤 코드 편집을 클릭하면 매우 간단하게 DOC클래스로 점프할 수 있다.
이것이 'ctrl + E' 즉 추가편집을 누른 화면이다. 우측의 클래스 뷰를 통해 DOC 클래스에 입력과 출력 변수가 선언된걸 확인하자.
이로써 레나 그림을 로드하기 위한 메모리 공간이 확보되었다.
unsigend char는 부호가 없는 문자형을 선언했다는 의미가 아니라 단지 8bit(1byte)를 표현하기 위함이다.
왜냐하면 우리가 사용하는 레나 그림은 그레이스케일이므로 한 픽셀을 표현하기 위해서는 8bit가 필요하기 때문이다.
이번에는 시리얼라이즈 함수에 대해 살펴보자.
이미지 파일을 읽거나 저장하기 기본적으로 알아두면 좋은 함수이다.
파일을 읽거나 저장하기에 편리한 함수 : Serialize() 함수.
시리얼라이즈 함수 : 파일 저장을 하면 if문을 실행, 파일 열기를 하면 else문을 실행한다.
이를 이용해 읽을 수 있는 파일 확장자인지 아닌지 출력문을 지정할수도 있다.
DOC클래스는 시리얼라이즈 함수를 제공하기 때문에 파일을 저장하고 불러오기가 유용하다.
메세지 출력은 LPCSTR대신에 _T()를 사용하자.(깨질 가능성 있음)
어쨋든 시리얼라이즈 함수를 사용하지 않으면 다이얼로그 및 열기 버튼 등등 일일이 만들어야했을것이다.
해당 코드는 교재의 336페이지를 참고하자.
이제 화면을 출력해보자.
아래그림을 보자
화면 출력은 view클래스에서 이뤄짐.
뷰 클래스의 OnDraw함수로 가자. 함수 안에 /*pDC*/는 주석 부분을 제거하자.
참고로 변수는 DOC클래스에 만들었으므로 그냥 사용할수는 없고 포인터를 사용하여 가져와야함.
OnDraw함수는 운영체제에서 제공하는 WM_PAINT를 받아 프로그램이 시작할때 그리기를 시작한다.
(다른 프레임으로 가렸다가 치우면 열심히 OnDraw()가 호출되서 그림을 그려대기 시작한다.)
그릴건 다 OnDraw에 넣어서 사용하면 된다.
참고로 BMP는 원래 그림이 거꾸로 들어가있다^^ 헤더 정보도 같이 포함되어 있는 그림을 예전 교재에서 본 기억이 있을것이다.
해당 코드는 교재의 338 페이지를 참고하자. MFC에서 상당부분 제공해주므로 우리는 for문 부터 작성하면 된다.
메뉴 만들기를 해보자.
메인프레임 클래스로 가자. 솔루션 탐색기를 눌러라. 리소스 파일이 있다.
+누르면 펼쳐진다. 파일이름.rc가 있다. 더블클릭하자.
오른쪽 위의 메뉴를 펼친뒤 IDR_MAINFRAME을 누르면 메뉴를 추가할 수 있는 하면이 등장.
메뉴를 만든뒤 우클릭 > 이벤트처리기 추가한뒤 메세지 타입은 command로 놔둔채
클래스 목록은 DOC로 지정하자. 그뒤 추가및 편집
오른쪽 아래에 ID를 만들자.
기본적인 영상 입출력 결과물이다. 당연한 얘기지만 위에가 BNP 파일, 아래가 RAW 파일이다.
시리얼라이즈 함수에서 지정한 확장자들을 불러 올 수 있다. 아니면 시리얼라이즈에서 지정한대로 경고문을 출력할것이다.
히스토그램:밝기값 분포를 나타냄, 곤잘레스와 오츠의 방법이 있다. 임계값을 이용한다.
p351부터 히스토그램 나와있음. 곤잘레스와 오츠는 복잡하므로 일단 생략
p365를 보면 오픈CV의 편리함을 알 수 있다.
'MFC' 카테고리의 다른 글
데이터 메모리 영역, 허프만 트리..를 만들어야 하지만 리스트 만들기 (0) | 2013.05.30 |
---|---|
DCT변환 (0) | 2013.05.23 |
이미지의 기하학적 변환 (1) | 2013.05.09 |
메디안 필터, 가우시안 필터, 에지검출 (0) | 2013.05.02 |
로우패스필터로 경계선을 흐리게 만들어보자. (0) | 2013.04.18 |