일반적으로 C를 이용하여 도스용 프로그램 제작시 가장 먼저 만들어 보는 프로그램이 다음과 같을 것입니다.
void main() { printf("MFC 프로그램 테스트\n"); } |
이 프로그램은 단지 화면에 'MFC 프로그램 테스트'라는 스트링을 표시합니다. 이곳에서는 이 기능을 하는 프로그램을 윈도우에서 작성하는 방법을 설명합니다. 또한 도스 프로그램과 윈도우 프로그램의 차이를 간단히 설명합니다.
여기서는 모든 내용을 자세히 설명하지는 않고 자주 사용하는 내용, 꼭 알아야 할 내용을 위주로 설명합니다.
Visual Studio를 설치한 후 실행하면 다음 그림과 같습니다..
File 메뉴의 부메뉴 New의 Project(Ctrl+Shift+N)를 선택하면 다음과 같은 대화 상자가 생성됩니다.
좌측 Tree에 여러 가지 항목 중 MFC를 선택한 경우 다음 3가지를 선택할 수 있습니다.
MFC Application : MFC 프로그램 제작시 사용합니다. 이 항목을 가장 많이 사용할 것입니다. 예제 또한 이 항목으로 설명합니다.
MFC ActiveX Control : ActiveX 프로그램 제작시 사용합니다.
MFC DLL : MFC용 dll 제작시 사용합니다.
각 항목의 선택에 따라 다음에 나타나는 대화 상자들이 달라집니다. 여기서는 MFC Application을 선택했을 경우에 대해 설명합니다.
MFC Application을 선택하고 Name에 프로젝트이름을 Location에 설정한후 OK버튼 선택하면 다음과 같은 대화상자가 생성됩니다.
Next를 선택하면 다음과 같이 화면에 나타납니다.
Application Type
Single document : Notepad처럼 하나의 프로그램에 하나의 창이 있는 구조의 프로그램 제작시 사용합니다.
Multiple document : Visual C++ 처럼 하나의 프로그램에 여러 개의 창을 띄울 수 있는 구조의 프로그램 제작시 사용합니다.
Dialog based : 대화 상자 형태로 실행되는 프로그램 제작시 사용합니다.
설명의 편의를 위해 Project style을 MFC standard로 설정했으며 default 값은 Visual Studio입니다.
Resource language는 Visual Studio를 설치한 언어에 따라 default 값이 나타납니다. 필자는 영문으로 설치하여 영어를 한국어로 바꾸어 설정했습니다.(영어로 그대로 두면 한국어가 모두 깨집니다).
Next>버튼을 선택하면 다음과 같은 대화상자가 생성됩니다.
Next>버튼을 선택하면 다음과 같은 대화상자가 생성됩니다.
Next>버튼을 선택하면 다음과 같은 대화상자가 생성됩니다.
Next>버튼을 선택하면 다음과 같은 대화상자가 생성됩니다.
Next>버튼을 선택하면 다음과 같은 대화상자가 생성됩니다.
Next>버튼을 선택하면 다음과 같은 대화상자가 생성됩니다.
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버튼을 선택하면 프로젝트가 생성되고 Visual C++은 다음과 같이 바뀌어 화면에 표시됩니다.
Build 메뉴의 Execute 프로젝트 명(Ctrl+F5)을 선택하면 컴파일을 수행하고 링크를 수행한 후 실행까지 시켜줍니다.
참고로 Build 메뉴중 컴파일 및 링크에 관계된 메뉴을 보면 다음과 같습니다..
Compile 프로젝트 명(Ctrl+F7) : 열려 있는 파일 중 선택한 파일을 컴파일 만 수행합니다.
Link 프로젝트 명(F7) : 링크를 수행합니다. 실행은 하지 않음.
다음 그림은 프로그램을 실행한 모양입니다.
프로그램 Source설명
MakeProgram.cpp : MainFrame을 생성하는 역할을 수행합니다.
MainFrm.cpp : 타이틀바, 메뉴, 툴바, 상태바 등 프로그램의 바깥 부분을 관리하는 역할을 수행합니다.
ChildFrm.cpp : MDI 프로그램일 경우 만 있습니다. MDI 창의 타이틀등 바깥 부분을 관리하는 역할을 수행합니다.
MakeProgramView.cpp : 클라이언트 영역(프로그래머 또는 사용자가 그릴 수 있는 영역)을 관리하는 기능을 수행합니다. 실제 화면에 표시하는 루틴을 이 파일에 추가합니다.
MakeProgramDoc.cpp : 각 View마다 생성되는 것으로 메모리 내용에 해당하는 부분을 여기에서 관리합니다.
MakeProgram.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 프로그램에서는 단지 해당 메시지가 발생했을 때 실행되는 함수를 작성하여 그 함수 내에 루틴을 추가하면 됩니다. WM_PAINT 메시지로부터 만들어 지는 함수는 OnPaint함수입니다. 이 함수를 만들어 화면에 출력될 루틴을 추가하면 되나 MFC에서 OnPaint를 약간 수정하여 만든 OnDraw함수(MakeProgramView.cpp에 추가되어 있다)를 주로 이용합니다.
화면 출력 부분은 MakeProgramView.cpp에서 다음과 같이 작성하면 됩니다.
void CMakeProgramView::OnDraw(CDC* pDC) { CMakeProgramDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CString strText = _T("MFC 프로그램 테스트"); pDC->TextOutW(100, 100, strText); } |
위와 같이 수정을 하고 프로그램을 실행하면(Ctrl+F5) 다음과 같이 화면에 나타납니다.
'Visual C++(MFC)' 카테고리의 다른 글
MFC06. 대화상자 (0) | 2022.03.07 |
---|---|
MFC05. RESOURCE (0) | 2022.03.07 |
MFC04. GUI(Graphic User Interface) (0) | 2022.03.07 |
MFC03. ClassView 사용법 (0) | 2022.03.07 |
MFC01. 프로그래밍에 대하여 (0) | 2022.03.07 |