728x90
반응형


실행환경 : Visual Studio 2013, Windows 32........ 




  영상처리 프로그램을 개발하는 데 있어서 가장 기본적인... 가장 기본적인 MFC 프로그래밍이 필요할 때가 와서 드디어 배워보려고 마음을 먹었다. 원래 프로그램을 짤 때 Qt 를 이용하여 작성하였었는데, 내가 생각하기엔 MFC를 먼저 배우고 Qt를 더 배우는게 낫지 않을까 싶다. 현업에서도 Qt 보다는 MFC를 많이 쓰는 실정이니깐... DC 관리를 하라고 꾸지람을 들은게 1년 정도 지난 것 같은데 이제서야 배우게 되서 조금 부끄럽기도 하지만 11월 한달 간 열심히 배워봐야겠다. 


  일단 MFC 프로그래밍은 Microsoft foundation classes 의 약자라고 내가 참고하는 블로그 관리자가 친절히 알려주었다. MFC는 말 그대로 윈도우 시스템이 그려주는 거라고 했다. 딱딱한 개념글보다 이렇게 공부하는 것이 더 좋은 듯 하다.


  또한, AppWizard, ClassWizard, Workspace 등과 MFC를 유기적으로 연결하여 응용프로그램을 쉽고 편리하게 만들어주는 도구이다. 즉, 모든 어플리케이션에 공통적으로 필요한 골격을 자동으로 생성해주는 것이다. 프로그래머는 여기에 고유 기능을 추가하는 역할만 수행하면 된다. 



MFC Framework

  MFC의 프레임워크는 다음과 같은 형식으로 구성되어있다. 각 객체들간의 통신은 멤버함수들이 담당하게 된다. 어플리케이션 클래스는 전역 객체를 생성하고 이 객체에 의해 응용프로그램 초기화, 메세지 루프, 종료 작업이 수행된다. Document Template Class는 프레임 클래스, 뷰 클래스, 도큐먼트 클래스, 리소스를 유기적으로 결합하여 관리하게 된다. 메인 프레임 클래스는 응용프로그램의 메인 윈도우를 표현하고 툴바, 상태바, 메뉴바 등 사용자 영역을 제외한 부분을 관리한다. 뷰클래스는 실제 데이터 들을 보여주는 사용자 영역을 관리하게 된다. 마지막으로 도큐먼트 클래스는 각종 데이터를 유지하고 관리하며 Serialization을 통한 파일 입출력을 담당한다. 




MFC 자료형

프로그래밍을 시작 할 때 제일 기본적인 자료형을 몇가지 훑어보자면 아래와 같다. 다른건 익숙한 자료형인데 DWORD 라던지 LPSTR 자료형은 생소하게 들린다. 

  

 자료형

 

BYTE 

unsigned char 형 

WORD 

unsigned short 형 

DWORD 

unsigned long 형 

LONG 

long 형 

LPSTR 

char* 형 

BOOL 

정수형, TRUE 또는 FALSE 


기타) HINSTANCE의 경우 정수형이지만 핸들의 의미를 가짐


예를 들자면 아래와 같은 식으로 사용된다.


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpcmdLine, int nCmdshow) {


}




핸들(Handle)

  MFC 프로그래밍을 하는데 앞서 '핸들'의 개념에 대해 알아볼 필요가 있다. 핸들이란 어떤 대상에 붙여진 레이블(Label)과 같은 것으로, 대상을 식별하는 데 사용된다. 또한 핸들을 이용하여 특정한 대상을 관리할 수 도있다. 자바의 Swing Component라던지 비주얼 베이직을 다뤄본 사람들이라면 핸들 개념이 어렵지 않을 것 같다. MFC에서 모든 메세지와 Command는 "On" 핸들러를 가져야한다. 커맨드 메세지는 사용자의 요청과 통신하는 데 사용된다. 메세지를 그에 해당하는 핸들러에 라우팅 하기 위해서 message maps을 사용한다. 


- 핸들 값은 예외 없이 모두 접두어 h로 시작

- 핸들은 정수형, 32bit 값

- 핸들은 운영체제가 발급하며, 사용자는 할당된 핸들을 쓰기만 하면됨

- 같은 종류의 핸들끼리는 절대 중복된 값을 가지지 않음

- 핸들은 단순한 구분자이므로 핸들에 어떤 값이 들어가 있는지 알 필요가 없음





MFC 윈도우 프로그램의 구조

윈도우 프로그램에서 큰 틀에서 살펴보자면 WinMain() 함수와 WndProc() 함수로 구성된다. 형식은 다음과 같은 형식으로 사용된다.


1. WinMain()

이 함수는 프로그램의 윈도우 자체를 생성한다. 또한 CWinApp 클래스에 존재한다. InitInstance, ExitInstance만 오버라이드 하여 사용가능하다. 


WinMain(){

윈도우 클래스 만들기 (RegisterClass(...))

윈도우 객체 생성하기 (CreateWindow(...))

윈도우 객체 화면에 띄우기 (ShowWindow(...))

메세지 루프 돌리기 (while(GetMessage(...)))

}


2. WindProc()

이 함수는 실제 일어나는 윈도우 메세지를 처리하는 역할을 수행한다. 즉 WinMain에서 실행된 메세지 루프로부터 전달받은 윈도우 메세지를 처리하게 된다. 


WindProc(){

전달된 메세지 처리하기 

}






MFC 프로젝트 생성 및 간단한 예제

1. Win32 Application 프로젝트 생성 - 빈프로젝트(Empty Project) 체크하고 확인




2. cpp 소스 추가하기




3. 소스코드 추가하고 실행해보기 - Hello World 










참고자료 1 : 비트교육센터 MFC 교재 pdf 

참고자료 2 : http://yyman.tistory.com/category/%28%EC%9D%B4%EC%A0%84%29%20Microsoft/MFC?page=4





728x90
반응형