4 장대화상자기반응용프로그램 3장에서는윈도우응용프로그램작성을위한 MFC 프로그래밍에텍스트편집기만을사용하였으나, 이장에서부터는응용프로그램마법사 (AppWizard), 리소스편집기, 클래스마법사 (Class Wizard) 등의도구를활용한다. 이러한도구들의이용으로전체프로그램소스에서프로그래머가직접코딩하는분량을크게줄일수있어빠른시간안에응용프로그램의개발이가능해진다. 또한 MFC 프로그램을구성하는부분들사이의연관구조가이러한도구들을통해구성되므로 MFC 프로그램구성에관한노력을현저히줄일수있다. 리소스편집기는컨트롤의배치, 메뉴의구성등등의여러작업을훨씬쉽게해준다. 이러한여러개발도구의이용을가능하게하고많은소스코드의자동생성을통해개발작업의효율을크게높여주는핵심도구가 AppWizard인데, AppWizard는아래와같은세가지전형적인윈도우응용프로그램유형을제공하며, 응용프로그램작성의첫단계에서개발자가유형을선택하면이에맞는소스코드를만들어준다. 대화상자기반응용프로그램 (Dialog based application) 단일문서응용프로그램 (SDI; Single Document Interface application) 다중문서응용프로그램 (MDI; Multiple Document Interface application) 개발자는 AppWizard가만들어준소스코드에필요한리소스와코드를추가하거나수정하여프로그램을완성해나간다. 이장에서는대화상자기반응용프로그램작성예제를몇개들어보이면서 AppWizard를비롯한도구들의사용방법을알아보며, 그다음장들에서 SDI/MDI 응용프로그램작성방법을알아본다. 4.1 AppWizard 를사용한 MFC 프로그래밍 AppWizard 를사용하는응용프로그램의작성은다음과같은세가지절차로이루어진다. AppWizard를사용하는프로젝트생성 리소스편집기를사용하는시각적설계 (visual design) 클래스마법사 (Class Wizard) 를활용하는코딩 위의단계들중프로젝트생성은응용프로그램작성의첫번째단계이며, 한번수행되면다시이단계로돌아오지않는다. 나머지단계들은간단한응용프로그램의경우순차적으로이루어질수도있지만, 많은경우두단계를오가며응용프로그램의작성이이루어진다. - 104 -
위의절차들이어떻게이루어지는지알아보기위해다음그림과같은간단한응용프로그램을작성해본다. 이프로그램은주실행창이다이얼로그박스이며, 타이틀바에는 "Dialog Program" 라는프로그램타이틀이나타난다. "Display message" 와 "Exit" 라는캡션을갖는두개의버튼이다이얼로그박스안에들어있다. 이중 "Display message" 버튼을클릭하면오른쪽그림에서와같은메시지박스가나타나며, "Exit" 버튼을누르면주실행창이사라지면서프로그램은종료된다. 4.1.1 프로젝트의생성 이전의경우와마찬가지로 [ 파일 ] 메뉴의 [ 새로만들기 ] - [ 프로젝트 ] 라는메뉴항목을선택하되, 아래화면의왼쪽열에서 <Visual C++> 의 <MFC> 라는템플릿을선택하고가운데열에서프로젝트유형으로 <MFC 응용프로그램 > 을선택한다. 프로젝트이름으로는 Dialog라는이름을사용하기로하자. 창하단의 < 확인 > 버튼을누른다. - 105 -
아래와같은 <MFC 응용프로그램마법사 > 화면이나타날텐데, 이를이용하여응용프로그램에관한사항들을설정한다. 이화면은 < 다음 > 버튼을눌러서나타나는화면들에따라진행할수도있고, 화면왼쪽의목차를클릭하며필요한사항들을설정할수도있다. 언제든지설정이완료되었다고판단되면 < 마침 > 버튼을누른다. 앞의화면에서 < 다음 > 버튼을누르면아래와같은화면이나타나는데, 여기서는응용프로그램종류와리소스언어를선택한다. 응용프로그램종류로는 " 대화상자기반 " 라디오버튼을선택한다. 리소스언어는컨트롤이나메뉴이름등을위한기본언어를선택하기위한것이다. 예를들어영어를선택하면, 버튼기본캡션으로 "OK", "Cancel" 등이나타나지만, 한국어를선택하면 " 확인 ", " 취소 " 등이나타난다. - 106 -
그다음화면에서는대화상자제목을변경할수있는데, 이는프로그램을실행시킬때나타나는창의상단에위치하는타이틀바에표시되는제목을말한다. 이제목은프로젝트이름과같게되어있는데, 이화면에서임의의내용으로변경할수있다. 대화상자제목을 "Dialog Program" 으로변경해보라. 그다음화면은다음과같으며, 변경없이진행한다. - 107 -
아래화면에서는 AppWizard가생성하는주요클래스들의이름을보여주고, 이클래스들의부모클래스이름, 이클래스들을선언하는헤더파일의이름, 이클래스들을구현하는소스파일의이름등을보여준다. 응용프로그램에따라서는부모클래스이름을변경함으로써프로그램의기능을변경하는일도있다. 여기서보여주는두개의클래스는응용프로그램클래스 CDialogApp와주실행창을위한 CDialogDlg 클래스이다. CDialogApp 클래스이름중 "Dialog" 는프로젝트이름을나타내며, 이클래스는 CWinApp 클래스를상속받는다. CDialogDlg 클래스는다이얼로그기반응용프로그램의주실행창이기때문에 CFrameWnd 클래스대신 CDialogEx 클래스를상속받는다. 이제 < 마침 > 버튼을누른다. ( 모두저장 ) 버튼을사용하여 AppWizard가만들어준내용들을저장한다음윈도우탐색기로프로젝트폴더를찾아가보면오른쪽그림과같이몇개의폴더들이만들어져있는것을볼수있다. Dialog 폴더안의.sln 파일,.sdf 파일, 그리고 Dialog/Dialog 폴더안의 *.vcproj.* 파일들은 AppWizard를사용하지않던이전의예제들에서도있었던파일들이다. - 108 -
그러나 Dialog Dialog 폴더안의나머지파일들과 Dialog Dialog res 폴더안의파일들은 AppWizard가만든파일이다..h 파일들과.cpp 파일들은 C++ 소스파일들인데, 특히 stdafx.h 파일은 MFC 사용을위한헤더파일들을모아둔것이다..rc,.aps 파일들과 res 폴더안의파일들은리소스에관한내용이다. AppWizard가만들어준파일들만으로도컴파일해서실행할수있는완전한프로그램이다. [ 디버깅하지않고시작 ] 메뉴항목을선택하거나단축기 Ctrl+F5를사용하여컴파일및실행해보면오른쪽그림과같은실행화면이나타난다. " 확인 " 버튼이나 " 취소 " 버튼을눌러프로그램을종료시킨다. 4.1.2 시각적설계 프로젝트생성마지막단계를마치고 < 마침 > 버튼을누르면다이얼로그기반응용프로그램의경우 Visual Studio는옆의그림과같은모습이된다. ( 이때화면오른쪽의도구상자부분은나타나있지않을수도있고위치를달리하여나타날수도있는데, 도구상자가보이지않을경우화면상단의 [ 보기 ] 메뉴에서 [ 도구상자 ] 메뉴항목을선택하여나타나게할수있다.) 위화면에서클라이언트영역의왼쪽에는프로젝트워크스페이스라고불리는창이있으며, 이창 - 109 -
하단에는솔루션탐색기, 클래스뷰, 속성탐색기, 리소스뷰등네개의탭이달려있다. 이탭을사용하여프로그램을구성하고있는파일, 클래스, 속성, 리소스등을일목요연하게볼수있으며, 각요소를창의오른쪽에나타나게만들수도있다. 아래그림에는네개의탭을선택하여안의항목들을펼쳐놓은모습을보이고있다. 프로젝트워크스페이스안의여러항목들을클릭해보고그결과로창의오른쪽에보이는내용들을관찰해보면, 프로젝트워크스페이스의기능을파악하는데도움이될것이다. 언제든지프로젝트워크스페이스의리소스뷰탭을클릭한다음주실행창을나타내는다이얼로그리소스 IDD_DIALOG_DIALOG를선택하면해당다이얼로그를편집할수있는상태가된다. 다른리소스항목의경우도마찬가지인데, 리소스유형마다다이얼로그편집기, 아이콘편집기, 스트링편집기등각기다른편집도구가사용된다. 이러한도구들을모두총칭하는이름이리소스편집기이다. 기본다이얼로그형태는 " 확인 ", " 취소 " 두개의버튼을포함하는것이며, 화면에는 "TODO:..." 라는내용의텍스트컨트롤이추가되어있다. 예제프로그램의경우이들대신 "Display message" 버튼과 "Exit" 버튼을필요로하므로먼저버튼들과텍스트를삭제한다. 삭제는마우스로해당컨트롤을선택한다음 "Del" 키를누르면된다. - 110 -
이제다이얼로그의크기를변경시킬수도있고, 컨트롤들을추가할수도있다. 컨트롤을추가할때는왼쪽그림과같은도구상자를사용한다. 컨트롤을추가하는방법은도구상자안의원하는아이콘을클릭한다음다시 IDD_DIALOG_DIALOG 다이얼로그박스안에서클릭하면그위치에해당컨트롤이나타난다. 드래그-앤-드롭방식으로컨트롤을끌어다놓을수도있다. 버튼의크기나위치도마우스를사용하여조정할수있다. 컨트롤에대해 ID, 캡션, 스타일등을포함하는여러속성들을변경할수있다. 컨트롤을클릭하면해당컨트롤에대한속성들이화면오른쪽의속성설정다이얼로그박스에나타난다. 첫번째버튼을위한속성설정다이얼로그박스에서 ID 속성은 IDC_BUTTON1, Caption 속성은 "Button1" 로되어있을것이다. 이를다음그림이나타내는대로각기 IDC_DISPLAY_BUTTON, "Display message" 로수정한다. ( 또는컨트롤을선택한상태에서키보드로캡션텍스트입력을시작하면캡션텍스트가변경된다.) 두번째버튼을위한속성설정다이얼로그박스에서 ID 속성은 IDC_EXIT_BUTT ON, Caption 속성은 "Exit" 로수정한다. 이것으로이프로그램에서시각적설계는완료된다. - 111 -
4.1.3 클래스마법사를이용한코딩 이프로그램을위해필요한코딩은두개의버튼에대한동작을위한것이다. 앞장에서이를위해메시지맵과메시지처리기 (Message Handler) 함수정의등의작업을했던것을기억할것이다. 여기에서는클래스마법사를이용하여이러한작업을훨씬간단히할수있음을보게될것이다. 클래스마법사를불러내는방법에는여러가지가있다. Visual Studio의 [ 프로젝트 ] 메뉴에서 [ 클래스마법사 ] 라는메뉴항목을선택할수도있고, Dialog 리소스화면에서버튼을선택한다음팝업메뉴를불러도 [ 클래스마법사 ] 라는메뉴항목이있다. 이러한방법으로클래스마법사를불러내면아래그림과같은 MFC Class Wizard 다이얼로그박스가나타난다. 여러탭중첫번째인 [ 명령 ] 탭이선택되어있어야한다. 프로젝트이름, 클래스이름등을확인한다음, 버튼의개체 ID(=IDC_DISPLAY_BUTTON) 와메시지 (=BN_CLICKED) 등을선택한다. 메시지를선택한후더블클릭하거나오른쪽의 [ 처리기추가 ] 버튼을클릭한다. - 112 -
그러면그림에서처럼 [ 멤버함수추가 ] 다이얼로그박스가나타나며, 함수이름은버튼의컨트롤 ID에따라정해지는데, 원한다면함수이름은변경될수있다. 추가된함수는 [ 멤버함수 :] 아래의리스트박스에나타난다. 리스트박스안의함수이름을더블클릭하거나클래스마법사다이얼로그박스오른쪽의 [ 코드편집 :] 버튼을누르면해당함수가구현되어있는소스코드위치로이동하며, 필요한코드를넣을수있다. 컨트롤을위한메시지처리기를추가하기위해클래스마법사를호출하는더욱간단한방법도있는데, 바로리소스편집기에서해당컨트롤을더블클릭하는방법이다. 이렇게하면바로함수편집상태로이동한다. CDialogDlg::OnClickedDisplayButton() 함수에는메시지다이얼로그출력을위해다음함수호출을넣는다. MessageBox(_T("This is a test dialog message.")); CDialogDlg::OnClickedExitButton() 함수에는다음함수호출을넣는다. OnOK() 함수는다이얼로그박스안에서 OK 버튼을누르면불려나오는함수인데, OK 버튼을누르면다이얼로그박스가종료된다. 다이얼로그기반응용프로그램의경우주실행창다이얼로그의종료는응용프로그램종료를의미한다. OnOK(); - 113 -
이제코딩작업도완료되었으므로모든파일들을저장한후프로그램을컴파일하여실행할수있을것이다. 연습문제 본문예제에관한다음지시사항들을수행해보라. 1. 프로젝트생성후각파일들의내용을읽어보라. 2. 프로젝트생성후프로젝트워크스페이스의클래스뷰, 리소스뷰, 솔루션탐색기등이보여주는정보가무엇인지확인하라. 3. 메시지처리기함수들을추가한다음클래스뷰를사용하여 CDialogDlg 클래스에서이함수들을찾아보라. 4. 솔루션탐색기에서 DialogDlg.h와 DialogDlg.cpp 파일들을찾아메시지맵과관련하여필요한내용들이어떻게추가되어있는지확인하라. 5. 예제에서사용된 OnOK() 함수는윈도우 API 함수인가? 또는어느클래스의멤버함수인가? 후자의경우 OnOK() 함수가소속되어있는클래스의이름은? OnOK() 함수에대한 Visual Studio 도움말을읽어보라. 6. 예제에서사용된 MessageBox() 함수는윈도우 API 함수인가? 또는어느클래스의멤버함수인가? 후자의경우 MessageBox() 함수가소속되어있는클래스의이름은? MessageBox() 함수에대한 Visual Studio 도움말을읽어보라. 어떤파라미터들을취하는가? 파라미터들을변경해보고그효과를관찰하라. 7. 버튼에대한속성설정다이얼로그박스에서 Client edge, Static edge, Modal Frame 등의스타일속성을찾아적용해보라. 8. 다이얼로그자체에대한속성설정다이얼로그박스에서어떠한스타일과속성들이있는지살펴보라. 특히응용프로그램타이틀과다이얼로그안의폰트를변경시켜보라. - 114 -