일반적으로 C를 이용하여 도스용 프로그램 제작시 가장 먼저 만들어 보는 프로그램이 다음과 같을 것이다.

 

void main()

{

        printf("MFC 프로그램 테스트\n");

}

 

이 프로그램은 단지 화면에 'MFC 프로그램 테스트'라는 스트링을 표시한다. 이곳에서는 이 기능을 하는 프로그램을 윈도우에서 작성하는 방법을 설명한다. 또한 도스 프로그램과 윈도우 프로그램의 차이를 간단히 설명한다.

여기서는 모든 내용을 자세히 설명하지는 않고 자주 사용하는 내용, 꼭 알아야 할 내용을 위주로 설명한다.

 

Visual C++을 설치한 후 실행하면 다음 그림과 같다.


 File 메뉴의 New(Ctrl+N)를 선택하면 다음과 같은 대화 상자가 생성된다.


프로젝트 종류 및 프로젝트 이름을 설정하는 대화 상자이다.

ATL COM AppWizard : COM 프로그램 제작시 사용한다.

MFC ActiveX ControlWizard : ActiveX 프로그램 제작시 사용한다.

MFC AppWizard(dll) : MFC용 dll 제작시 사용한다.

MFC AppWizard(exe) : MFC 프로그램 제작시 사용한다. 이 항목을 가장 많이 사용할 것이다. 예제 또한 이 항목으로 설명한다.

Win32 Application : SDK로 실행파일을 만들고자 할 때 사용한다.

Win32 Console Application : Console 프로그램 제작시 사용한다. 도스용 프로그램을 Visual C++에서 작성하고자 할 경우 사용한다.

Win32 Dynamic-Link Library : 일반 dll 제작시 사용한다.

Win32 Static Library : 일반 lib 제작시 사용한다.

나머지 항목은 필자도 사용해 보지 않았다. 또한 윈도우용 프로그램을 제작하려고 한다면 MFC AppWizard(exe)를 사용하고 도스용 프로그램을 제작하려고 한다면 Win32 Console Application을 사용한다. 나머지 항목은 프로그램을 제작하다가 필요한 경우가 생겼을 경우 사용하면 되므로 지금은 알 필요없다.

각 항목의 선택에 따라 다음에 나타나는 대화 상자들이 달라진다. 여기서는 MFC AppWizard(exe)를 선택했을 경우만 설명한다.


좌측 항목을 MFC AppWizard(exe)를 선택하고 프로젝트이름을 설정한후 OK버튼 선택하면 다음과 같은 대화상자가 생성된다.


Single document : Notepad처럼 하나의 프로그램에 하나의 창이 있는 구조의 프로그램 제작시 사용한다.

Multiple document : Visual C++ 처럼 하나의 프로그램에 여러 개의 창을 띄울 수 있는 구조의 프로그램 제작시 사용한다.

Dialog based : 대화 상자 형태로 실행되는 프로그램 제작사 사용한다.

 


Multiple document를 설정하고 Next>버튼을 선택하면 다음과 같은 대화상자가 생성된다.



Next>버튼을 선택하면 다음과 같은 대화상자가 생성된다.


Next>버튼을 선택하면 다음과 같은 대화상자가 생성된다.


 

Next>버튼을 선택하면 다음과 같은 대화상자가 생성된다.


Next>버튼을 선택하면 다음과 같은 대화상자가 생성된다.


CChapt1View(Chapt1은 프로젝트 이름과 같다)를 선택하고 Base class에서 View의 Base class를 설정한다. 설정 가능하는 항목을 보면 다음과 같다.

CEditView : View가 택스트 편집기의 형태일 경우 선택한다.

CFormView : View가 대화 상자의 모양일 경우 선택한다.

CHtmlView : Html 문서 보기등의 프로그램일 경우 선택한다. 한번도 사용해 본적이 없다.

CListView : View가 리스트 형태일 경우 선택한다.

CRichEditView : View가 택스트 편집기의 형태일 경우 선택한다. CEditView 보다 기능이 더 많다.

CScrollView : View에 스크롤 바가 필요할 경우 사용한다.

CTreeView : View가 Tree형태일 경우 사용한다.

CView : 위의 경우가 아닐 경우 선택한다.

위 항목들은 프로그램의 종류에 따라 적당한 것을 선택해야만 하나 내용을 잘 모르겠으면 CView 또는 CScrollView를 선택하여 프로그램한다.

 


Finish버튼을 선택하면 다음과 같은 대화상자가 생성되어 현재까지의 설정을 보여준다.

 

OK버튼을 선택하면 프로젝트가 생성되고 Visual C++은 다음과같이 바뀌어 화면에표시된다.


Build 메뉴의 Execute 프로젝트 명(Ctrl+F5)을 선택하면 컴파일을 수행하고 링크를 수행한 후 실행까지 시켜준다.

참고로 Build 메뉴중 컴파일 및 링크에 관계된 메뉴을 보면 다음과 같다.

Compile 프로젝트 명(Ctrl+F7) : 열려 있는 파일 중 선택한 파일을 컴파일 만 수행한다.

Link 프로젝트 명(F7) : 링크를 수행한다. 실행은 하지 않음.

 

다음 그림은 프로그램을 실행한 모양이다.

 

프로그램 Source설명

Chapt1.cpp : MainFrame을 생성하는 역할을 수행한다.

MainFrm.cpp : 타이틀바, 메뉴, 툴바, 상태바 등 프로그램의 바깥 부분을 관리하는 역할을 수행한다.

ChildFrm.cpp : MDI 프로그램일 경우 만 있다. MDI 창의 타이틀등 바깥 부분을 관리하는 역할을 수행한다.

Chapt1View.cpp : 클라이언트 영역(프로그래머 또는 사용자가 그릴 수 있는 영역)을 관리하는 기능을 수행한다. 실제 화면에 표시하는 루틴을 이 파일에 추가한다.

Chapt1Doc.cpp : 각 View마다 생성되는 것으로 메모리 내용에 해당하는 부분을 여기에서 관리한다.

Chapt1.rc : 메뉴, 대화 상자 모양등 리소스를 관리한다.

생성된 프로그램 Source는 위와 같다. 실제 파일을 열어 보면 정말 복잡하고 알기 힘들다는 것을 알 수 있을 것이다. 이 모든 내용을 알아야만 프로그램을 할 수 있는 것은 아니다. 간혹 이 Source들을 모두 분석하려고 하다가 도저히 모르겠다고 Visual C++은 너무 어렵구나 하고 포기하는 사람들이 있다. 지금은 단지 각 파일별로 기능들을 대강 익혀 두고 넘어 가기 바란다. 계속 프로그램을 하다 보면 대강 내용을 알게 될 것이다.


도스 프로그램과 윈도우 프로그램의 차이점

도스용 프로그램과 윈도우용 프로그램의 구조적인 면에서 가장 큰 차이점은 윈도우용 프로그램이 멀티타스킹이 된다는 점이다. 즉 도스용 프로그램은 오직 한 프로그램만 실행이 가능하고(물론 윈도우에서 도스용 프로그램을 실행하면 윈도우가 창을 만들어 프로그램을 실행하고 여러 개의 프로그램이 실행되도록 만들었다), 윈도우용 프로그램은 여러 개의 프로그램이 실행 가능하다는 것이다. 단지 이 차이점 때문에 프로그램 작성시 다음과 같이 크게 두 가지의 다른 점이 있다(물론 다른 점이 훨씬 많으나 여기서는 화면상에 정보를 출력할 때 구조적 차이점만 언급한다).

1. 화면상에 표시할 때 정보가 더 필요하다.

도스용 프로그램을 실행하면 하나의 프로그램이 전체 화면상에 나타난다. 따라서 도스용 프로그램에서 화면상에 정보를 표시하려면 출력할 화면의 좌표(절대 좌표)와 어떻게 표시할 것인지에 해당하는 정보만 있으면 출력이 가능하다. 그러나 윈도우용 프로그램은 여러 개의 프로그램이 실행되고 그 프로그램의 위치 또한 마음대로 이동할 수 있으므로 같은 좌표에 표시하더라도 여러 프로그램이 겹쳐 있으면 어디에 표시해야 할지 알 수가 없다. 따라서 도스용 프로그램에서 사용하는 정보 외에 표시할 창의 정보가 필요하다. 또한 화면의 좌표 또한 절대 좌표가 아닌 상대 좌표를 사용한다. 표시할 창의 정보는 CDC를 사용한다(실제 CDC는 창의 정보뿐만 아니라 다른 정보(펜색상, 면색상, 글자 폰트 등)들도 포함하고 있다).

예를 들어 도스 프로그램의  printf("MFC 프로그램 테스트\n"); 기능을 하는 함수를 보면(printf문은 표시할 좌표가 없이 특수하게 제작된 함수로 만약 정확한 위치에 문자열을 표시하려면 좌표 정보가 있어야 한다) pDC->TextOut(100, 100, "MFC 프로그램 테스트");이다.

pDC는 CDC* pDC로 선언되고 OS에서 자동으로 넘겨 준다.

참고로 SDK 프로그램에서는CDC 대신 HDC를 사용하고 프로그래머가 얻어야만 한다.

 

2. 화면상에 표시하는 시점이 다르다.

도스용 프로그램은 표시하고자 하는 시점에서 그 표시 내용을 출력하는 루틴을 삽입하면 화면상에 출력된다. 이것은 도스용 프로그램이 하나만 실행되어 프로그래머가 그 내용을 지우기 전까지는 화면에 계속 표시되는 구조이므로 가능하다. 그러나 윈도우용 프로그램일 경우 여러 프로그램이 실행되어 서로 겹쳐 실행되었을 경우 뒤에 숨겨져 있던 화면이 앞으로 나오거나 창 크기를 변경하면 화면이 지워져서 나타난다. 따라서 화면이 지워 졌을 시점 마다 화면의 내용을 그려줘야만 한다. 이 기능을 지원하기 위해서 윈도우는 메시지큐를 이용하여 동작하도록 구성(실제 메시지 큐는 이 기능 외에 멀티타스킹을 구현하기 위하여 고안된 구조이다)되어 있다. 메시지 큐 구조는 SDK구조로 프로그램할 경우 정확히 이해해야 프로그램을 할 수 있으나 MFC 프로그램에서는 어느 정도 숨겨져 있어 이 내용을 몰라도 프로그램을 할 수 있다. 그러나 고급 프로그래밍을 하기 위해서는 어느 정도는 알아야 하므로 필요 시점 마다 조금씩 설명할 것이므로 차츰 익혀 나가기 바란다.

우선 화면상에 표시하는 방식을 예로 메시지 큐의 전반적인 구조를 간단히 보면, 화면이 지워져 새로 그려야 할 시점이 되면 OS가 알아서 WM_PAINT라는 메시지를 메시지 큐에 넣고 윈도우는 그 메시지를 가져와 실행하는 구조로 되어 있다. MFC 프로그램에서는 단지 해당 메시지가 발생했을 때 실행되는 함수를 작성하여(함수 작성법은 Class Wizard 사용법에서 설명) 그 함수 내에 루틴을 추가하면 된다. WM_PAINT 메시지로부터 만들어 지는 함수는 OnPaint함수이다. 이 함수를 만들어 화면에 출력될 루틴을 추가하면 되나 MFC에서 OnPaint를 약간 수정하여 만든 OnDraw함수(Chapt1View.cpp에 추가되어 있다)를 주로 이용한다.

 

화면 출력 부분은 Chapt1View.cpp에서 다음과 같이 작성하면 된다.

void CChapt1View::OnDraw(CDC* pDC)

{

         CChapt1Doc* pDoc = GetDocument();

         ASSERT_VALID(pDoc);


         pDC->TextOut(100, 100, "MFC 프로그램 테스트");

}

위와 같이 수정을 하고 프로그램을 실행하면(Ctrl+F5) 다음과 같이 화면에 나타난다.

 

 

 

Class Wizard 사용법

 

  기본 프로그램 제작에서도 잠깐 설명했듯이 윈도우 시스템은 메시지 방식(메시지 큐를 통하여 전달)을 이용하여 프로그램이 원하는 기능을 수행한다. 키보드를 누르면 키보드가 눌러 졌다는 메시지(WM_KEYDOWN)가 발생하고 마우스를 움직이면 마우스가 움직였다는 메시지(WM_MOUSEMOVE)가 발생하고..... 프로그램에서는 이 메시지들을 처리해 주면 된다. Class Wizard는 이 메시지로부터 유도되는 함수를 제작해 주는(다른 기능도 좀더 있다) 역할을 한다. 즉 메시지가 발생했을 때 실행될 함수를 생성한다.

  Class Wizard는 Visual C++ 프로그램의 View 메뉴의 부메뉴 ClassWizard(Ctrl+W)를 선택하면 다음과 같이 실행된다.


Class name : 메시지를 삽입하고자 하는 Class를 선택한다. 메시지는 대부분 MainFrame또는 View에 삽입한다. SDI 프로그램에서는 둘 중 어디에 삽입하여도 되나 MDI의 경우 View(View는 Mdi 창에 포함된다)가 있을 때만 실행해야 하는 메시지일 경우에는 View에 그렇지 않은 경우에는 MainFrame에 삽입한다.

Object IDs : 메시지를 처리하기 위해서는 위 그림과 같이 Class name과 같은 이름을 선택해야 한다. 나머지는 메뉴 ID 처리(메뉴를 선택했을 때 발생하는 메시지 처리) 대화 상자 객체 ID 처리(대화상자의 버튼 등을 선택했을 때 발생하는 메시지 처리) 등 ID에 의한 메시지 처리시 사용한다.

Messages : 스크롤을 해서 아래로 내려가면 WM_으로 시작하는 메시지들이 있다. 이 메시지들이 윈도우 시스템에서 기본적으로 제공하는 메시지들이고 상단의 WM_으로 시작하지 않는 메시지들은 MFC에서 제공하는 메시지들이다. 원하는 메시지에서 마우스를 더블클릭하면 그 함수가 Member functions에 추가가 되고 Source에 삽입된다. 참고로 Object IDs에서 메뉴 ID 또는 대화 상자 ID를 선택하면 Messages가 그 ID의 종류에 따라 다르게 나타난다. 그러나 대부분 COMMAND와 UPDATE_COMMAND_UI이다. COMMAND를 더블클릭하면(그 메시지가 발생할 때 실행되는 함수 생성) ID와 비슷한 이름의 함수가 대화 상자에 표시되고(수정가능하나 되도록 수정하지 말기 바란다) 확인을 하면 추가가 된다.

Member functions : 삽입되어 있는 함수들을 리스트로 보여 준다. 소스 편집을 하고자 하는 함수에서 마우스를 더블클릭하면 해당 소스로 이동한다.

메시지들은 차츰 익혀 가기 바라고(이름을 보면 대강 기능을 알 수 있을 것이다)여기에서 자주 쓰는 메시지들을 대강 정리한다.


WM_CHAR : 키보드를 눌렀다(WM_KEYDOWN메시지 발생) 떼는 순간(WM_KEYUP 메시지 발생 바로 직전)에 발생하는 메시지로 키보드의 아스키 값을 포함한다.

WM_CLOSE : 해당 윈도우가 종료되기 직전에 발생한다.

WM_CREATE : 해당 윈도우가 생성되기 직전에 발생한다.

WM_DESTROY : 해당 윈도우가 종료될 때 발생한다.

WM_INITDIALOG : 대화 상자가 생성을 마쳤을 때 발생한다. 설정한 Class가 대화 상자일 경우만 있고 대화 상자 항목의 초기화는 여기에서 해야만 한다.

WM_LBUTTONDBLCLK : 마우스 왼쪽 버튼을 더블클릭할 때 발생한다.

WM_LBUTTONDOWN : 마우스 왼쪽 버튼을 누를 때 발생한다.

WM_LBUTTONUP : 마우스 왼쪽 버튼을 뗄 때 발생한다.

WM_MOUSEMOVE : 마우스를 움직일 때 발생한다.

WM_SIZE : 윈도우의 크기를 변경할 때 발생한다.

WM_TIMER : 타이머를 설정했을 경우 설정한 발생 주기 마다 발생한다.


'▣ 참고 > C++' 카테고리의 다른 글

C++ 예제 모음  (0) 2008.11.12
C++ RESOURCE 사용  (0) 2008.11.12
C++ 대화 상자  (0) 2008.11.12
Posted by 티스토릴 :