Programming hwp

Similar documents
Comtrol ID 레이블 Hotkey Callback 함수 ⑴ Button, IDC_BTN_DEPT, &Department, OnBtnDepartment ⑵ Button, IDC_BTN_EMP, &Employee, OnBtnEmployee ⑶ Button, IDC_B

Programming hwp

웹캠을이용한노트북도난경보시스템 (S.I.L.C) 팀명 :It's Real 담당교수님 : 이병천교수님 조장 : 최용현 (07) 조원 : 최철원 (07) 신준섭 (07) 김명진 (08) 정보보호학과 - 1 -

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

윈도우시스템프로그래밍

윈도우시스템프로그래밍

PowerPoint Template

PowerPoint Presentation

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

윈도우 프로그래밍의 개념

Microsoft PowerPoint - hci2-lecture9.ppt

윈도우시스템프로그래밍

[제1강] 텍스트를 입력하세요

윈도우 프로그래밍의 개념

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

PowerPoint Presentation

윈도우즈프로그래밍(1)

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

윈도우시스템프로그래밍

설계란 무엇인가?

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

untitled

BMP 파일 처리

Microsoft Word - hci07-final-answer.doc

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Visual Basic 반복문

Microsoft PowerPoint _대화상자.ppt

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

K&R2 Reference Manual 번역본

Microsoft Word - hci08-final-answer.doc

오버라이딩 (Overriding)

chap 5: Trees

Microsoft PowerPoint - C++ 5 .pptx

슬라이드 1

DLL(Dynamic Linked Library)

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - 09-CE-14-리스트콤보박스

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

Microsoft PowerPoint - [2009] 02.pptx

Programming hwp

슬라이드 1

C++ Programming

PowerPoint 프레젠테이션

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

Microsoft Word - src.doc

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Lab 3. 실습문제 (Single linked list)_해답.hwp

설계란 무엇인가?

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

gnu-lee-oop-kor-lec06-3-chap7

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

<4D F736F F F696E74202D203036C0E520BBE7BFEBC0DA20C0CEC5CDC6E4C0CCBDBA205BC8A3C8AF20B8F0B5E55D>

untitled

Microsoft PowerPoint - Chapter 6.ppt

어댑터뷰

歯Lecture2.PDF

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

ISP and CodeVisionAVR C Compiler.hwp

기존에 Windchill Program 이 설치된 Home Directory 를 선택해준다. 프로그램설치후설치내역을확인해보면 Adobe Acrobat 6.0 Support 내역을확인할수 있다.

17장 클래스와 메소드

Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

슬라이드 1

JAVA PROGRAMMING 실습 08.다형성

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - additional01.ppt [호환 모드]

C++ Programming

C++ Programming

Dialog Box 실행파일을 Web에 포함시키는 방법

[제1강] 텍스트를 입력하세요

4S 1차년도 평가 발표자료

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

MFC 프로그래밍

그래픽 프로그래밍

윈도우 프로그래밍의 개념

C 언어 프로그래밊 과제 풀이

슬라이드 1

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

UI TASK & KEY EVENT

Microsoft PowerPoint - 04-UDP Programming.ppt

슬라이드 1

Microsoft PowerPoint - 06-Body Data Class.pptx

Transcription:

4.2 메뉴및컨트롤들의추가 이절에서다룰예제프로그램은덧셈 / 곱셈문제를제시하고답을검사해주는프로그램이다. 이프로그램을실행하면두개의한자리숫자들이무작위로생성되어 "Number 1" 과 "Number 2" 옆의에디트컨트롤에나타난다. Exec 메뉴안에는 Renew라는메뉴항목이있으며, 이메뉴항목을선택할때마다숫자들은무작위로변경된다. Exec 메뉴안의 Change Level 메뉴항목을선택한후 Renew를사용하면두자리난수가발생되며, Change Level 메뉴항목을다시선택하면다시한자리숫자로돌아간다. Name 옆의에디트컨트롤에는사용자이름을입력하며, 라디오버튼을사용하여문제유형이덧셈인지곱셈인지를선택한다. Answer 옆의에디트컨트롤에는답을입력한다. Exec 메뉴안의 Check 메뉴항목을선택하면, 답이맞는지확인하여알맞은메시지다이얼로그박스를띄워준다. 이예제를통해살펴볼내용은다음과같다. 텍스트컨트롤, 에디트컨트롤, 라디오버튼컨트롤등의컨트롤이용방법 특히에디트컨트롤이나라디오버튼컨트롤의경우에는사용자의입력값또는선택을나타내는변수가있으며, 다이얼로그박스안의컨트롤들에대해변수를연계시켜처리하는방법을다룬다. 다이얼로그박스에메뉴사용 메뉴리소스는 SDI/MDI 응용프로그램유형의경우에는 AppWizard에의해자동적으로포함된다. 기본형다이얼로그기반응용프로그램에서는메뉴를사용하지않는데, 이절에서는메뉴를다이얼로그박스에추가하는방법을설명한다. 또이를통해메뉴의편집, 리소스의추가등의주제를다룬다. - 115 -

4.2.1 프로젝트의생성 이작업은다음사항을제외하고는 4.1 절의경우와같다. 프로젝트이름을 Arith로정한다. 리소스언어를영어 [ 미국 ] 으로정한다. 이경우 Visual Studio 6 등의예전버전의 Visual Studio에서는타이틀바나컨트롤캡션에한글을사용하면실행시한글대신깨진글자들이나타났었지만최근버전들에서는이러한문제는해결된것으로보인다. 4.2.2 시각적설계 이응용프로그램의경우시각적설계는다이얼로그설계와메뉴설계로나누어진다. 다이얼로그에는옆의그림과같이 4개의에디트컨트롤과이들을설명하는 4개의텍스트컨트롤, 그리고 2개의라디오버튼그룹등이포함된다. 다이얼로그박스자체를포함하여컨트롤들의속성은오른쪽표와같이정한다. 다이얼로그에서는타이틀을 "Arithmetic Practice Program" 으로정하고, 최소화및최대화버튼을추가하고, 폰트를바탕 10pt로변경한다. 에디트컨트롤들중 "Number 1", "Number 2" 옆의것들은비활성화 (disabled) 되어있어사용자가내용을변경할수없고, 프로그램안에서계산된값을표시하는용도로사용된다. 라디오버튼들은여러개가하나의그룹을형성하도록되어있으며, 한그룹안의라디오버튼들중한개만선택할수있도록되어있다. 이중한버튼을클릭하여선택하 Object Property Setting Dialog Box ID Caption Font (Size) Minimize box Maximize box IDD_ARITH_DIALOG Arithmetic Practice Program 바탕 (10) True True Static Text Caption Name Static Text Caption Number 1 Static Text Caption Number 2 Static Text Caption Answer Edit Box ID IDC_NAME_EDIT Edit Box Edit Box ID Disabled ID Disabled IDC_NUM1_EDIT True IDC_NUM2_EDIT True Edit Box ID IDC_ANSWER_EDIT Radio Button Radio Button ID Caption Group ID Caption Group IDC_ADD_RADIO Addition True IDC_MULT_RADIO Multiplication False - 116 -

면기존에선택되어있던라디오버튼의선택은해제된다. 라디오버튼그룹은 group 속성이 True로설정되어있는라디오버튼과탭순서번호상그후에나타나는라디오버튼들로이루어진다. group 속성이 True로설정되어있는라디오버튼이다시나타나면새로운그룹이시작된다. 메뉴를만들기위해먼저 Visual Studio의 [ 프로젝트 ] 메뉴의 [ 리소스추가 ] 메뉴항목을선택하면리소스유형선택을위한다이얼로그박스가오른쪽그림과같이나타난다. [Menu] 를선택한다음 [ 새로만들기 ] 버튼을클릭하면메뉴편집화면이나타난다. 메뉴편집화면에서 Exec와 Exit라는이름의메뉴들을만든다음그림에나타난대로메뉴항목들을만든다. 메뉴, 메뉴항목, 컨트롤등의캡션을정할때밑줄표시된문자가포함되어있는경우를흔히볼수있다. 이러한문자는마우스대신키보드를사용하여메뉴나컨트롤에접근할수있게하기위한것으로편의키 (mnemonic key) 라고불린다. 편의키의설정을위해해당문자앞에 & 기호를덧붙인다. 예를들면, E&xit는 Exit라고표시된다. Exec 메뉴안의처음두메뉴항목과마지막메뉴항목사이에는분리선이표시되어있는데, 이를위해서는메뉴항목을입력하는대신 [ 구분선삽입 ] 메뉴항목을사용한다..rc 파일은리소스들에대한정의를갖고있으며, 리소스컴파일러라는도구에의해.res 파일로변환되어프로그램에서이용된다. 아래내용은메뉴설계가완료된후.rc 파일의내용중메뉴관련부분만추출한것이다. 이내용대로각메뉴항목을위한객체 ID를정해준다. - 117 -

///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_MENU1 MENU BEGIN POPUP "&Exec" BEGIN MENUITEM "&Renew", MENUITEM "&Check", MENUITEM SEPARATOR MENUITEM "Change &Level", END POPUP "E&xit" BEGIN MENUITEM "&Quit", MENUITEM "&Save and Quit", END END ID_EXEC_RENEW ID_EXEC_CHECK ID_EXEC_CHANGELEVEL ID_EXIT_QUIT ID_EXIT_SAVEANDQUIT 메뉴설계가완료된후 IDD_ARITH_DIALOG 다이얼로그에게 IDR_MENU1이라는메뉴를사용하도록알려주어야한다. 이를위해 IDD_ARITH_DIALOG 다이얼로그의 Menu 속성을메뉴의리소스 ID인 IDR_MENU1으로설정한다. 4.2.3 클래스마법사를사용하는코딩 다이얼로그상의버튼컨트롤이나메뉴항목등의경우클릭을통해당장어떤작업이수행될것을기대한다. 따라서이와같은이벤트로인해발생하는메시지를처리하는함수를메시지맵을통해규정하는것으로관련코딩이완료된다. 반면에디트컨트롤이나라디오버튼의경우사용자입력이나선택을변수를통해저장해두었다가나중의처리과정에서저장된값들을이용하게된다. 이를위해이와같은컨트롤에는연계변수를설정한다. 연계변수의설정을위해멤버변수추가마법사를사용할수도있지만, 여기에서는클래스 - 118 -

마법사를이용한다. ( 멤버변수추가마법사를호출하는방법들에대해서는스스로찾아보기바란다.) 변수를연계시킬컨트롤을선택한후팝업메뉴를통해클래스마법사를호출하면컨트롤 ID 리스트박스에해당컨트롤의 ID가선택되어있을것이다. 물론 [ 프로젝트 ] 메뉴에서 [ 클래스마법사 ] 메뉴항목을선택한후컨트롤 ID를나중에선택해도무방하다. 클래스마법사다이얼로그에서 [ 멤버변수 ] 탭이선택되어있음을확인해야하며, 또클래스이름이컨트롤들을담고있는다이얼로그클래스임을확인한다. 이는컨트롤연계변수들이다이얼로그클래스의멤버변수가될것임을의미한다. 변수연계가필요한컨트롤들의 ID에는 4개의에디트컨트롤을위한 IDC_NAME_EDIT, IDC_NUM1_EDIT, IDC_NUM2_EDIT, IDC_ANSWER_EDIT 등과그룹속성을갖는라디오버튼을위한 IDC_ADD_RADIO 등이있다. 해당 ID를더블클릭하거나해당 ID를선택한후 [ 변수추가 ] 버튼을클릭하면 [ 멤버변수추가 ] 다이얼로그박스가나타난다. 에디트컨트롤에연계될변수의타입으로는스트링 (CString) 또는정수 (int, UINT, long,...) 가허용되며, 라디오버튼그룹에연계될변수의타입으로는정수 (int) 또는 Bool만허용된다. 연계변수의 [ 범주 ] 속성으로는 Control 대신반드시 Value가선택되어야한다. - 119 -

라디오버튼그룹에는 m_nradio (int 타입 ), IDC_NAME_EDIT, IDC_NUM1_EDIT, IDC_NUM2_EDIT, IDC_ANSWER_EDIT 등에대해서는각기 m_strname (CString 타입 ), m_nnum1 (int 타입 ), m_nnum2 (int 타입 ), m_nanswer (int 타입 ) 등으로정한다. 이렇게다이얼로그상에나타나는컨트롤들에연계된변수들을 DDX(Dialog Data Exchange) 변수라고부르는데, 값들은다이얼로그화면에서변수로이동하거나또는그역방향으로이동한다. 이러한이동은다이얼로그클래스안의멤버함수 DoDataExchange() 안에서이루어지는데, 프로그래머는 UpdateData() 함수를호출하여값의교환이일어나게할수있다. UpdateData() 함수는 DoDataExchange() 함수를호출한다. UpdateData(TRUE) 는다이얼로그화면상의값을변수에저장시키는데, 이때인수 TRUE는디폴트인수이므로생략될수있다. UpdateData(FALSE) 는변수들이갖고있는값을화면에나타나게만든다. 다이얼로그가화면에처음나타날때 UpdateData(FALSE) 가자동적으로실행된다. 그리고다이얼로그안의 [ 확인 ] 버튼을클릭하여다이얼로그를닫을때 UpdateData(TRUE) 가자동적으로실행된다. DDX 변수에는정수의경우최소값이나최대값을설정할수있으며 ( 아래그림하단부분을참고 ), 스트링의경우최대길이를설정할수있다. 이러한제한값들을 DDV(Dialog Data Validation) 값이라고하며, 사용자가이러한제한을어기면자동적으로경고메시지가뜨게된다. (m_nanswer의범위는 1~9999, m_strname의최대길이는 10으로설정하라. 그리고이러한제약을벗어난값들을입력한후발생하는현상을관찰해보라.) Change Level 메뉴항목은클릭할때마다무작위생성할숫자크기로한자릿수와두자릿수사이를오가게하며, 어떤자릿수가현재선택되어있는지를나타내는변수가필요하다. 이프로그램에서한자릿수는 1에서 9 사이의숫자, 두자릿수는 1에서 99 사이의숫자를의미하는것으로한다. 자릿수를나타내는변수는 m_nlimit(int 타입 ) 으로정하고, 그값은 9와 99 사이를오가도록한다. ( 이변수는 1 + rand() % m_nlimit 라는식에서사용된다.) 컨트롤과무관한클래스의멤버변수를포함시키는방법은여러가지가있다. 프로젝트워크스페이스에서솔루션탐색기로가서해당클래스를선언하고있는헤더파일을열어클래스선언안에멤버변수를선언하는것도한방법이다. 여기서는아래그림과같이클래스뷰에서클래스이름을선택한다음팝업메뉴를연다음 [ 추가 - 변수추가 ] 메뉴항목을선택하여나타나는멤버변수추가마법사를이용한다. 이로써멤버변수들에대한선언은완료되었으며, 남은부분은필요한메시지처리기함수들을정의해주는일이다. 이프로그램에서처리기함수를필요로하는것은 5개의메뉴항목이다. 그리고프로그램실행시필요한초기화작업은다이얼로그클래스의생성자인 CArithDlg() 함수나멤버함수 - 120 -

OnInitDialog() 에서해줄수있는데, 여기서는 OnInitDialog() 함수안에서초기화를처리하기로 한다. 아래에멤버함수관련사항을객체 ID, 메시지 ID, 함수이름등의순서로요약하고있 다. CArithDlg - WM_INITDIALOG - OnInitDialog() : 편집 IDC_EXEC_RENEW - COMMAND - OnExecRenew() : 새로정의 IDC_EXEC_CHECK - COMMAND - OnExecCheck() : 새로정의 IDC_EXEC_CHANGELEVEL - COMMAND - OnExecChangelevel() : 새로정의 IDC_EXIT_QUIT - COMMAND - OnExitQuit() : 새로정의 IDC_EXIT_SAVEANDQUIT - COMMAND - OnExitSaveandquit() : 새로정의 다이얼로그클래스헤더파일및구현파일 아래소스에서음영처리된부분은관심을갖고살펴볼부분을나타낸다. 라고표시되어있는부분은멤버함수중추가코딩작업한부분을나타낸다. // ArithDlg.h : header file // #pragma once // CArithDlg dialog class CArithDlg : public CDialogEx // Construction public: CArithDlg(CWnd* pparent = NULL); // standard constructor // Dialog Data enum IDD = IDD_ARITH_DIALOG ; protected: virtual void DoDataExchange(CDataExchange* pdx); // DDX/DDV support // Implementation protected: HICON m_hicon; public: // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nid, LPARAM lparam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() int m_nradio; int m_nanswer; CString m_strname; - 121 -

; int m_nnum1; int m_nnum2; int m_nlimit; afx_msg void OnExecRenew(); afx_msg void OnExecChangelevel(); afx_msg void OnExecCheck(); afx_msg void OnExitQuit(); afx_msg void OnExitSaveandquit(); // ArithDlg.cpp : implementation file // #include "stdafx.h" #include "Arith.h" #include "ArithDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx public: CAboutDlg(); // Dialog Data enum IDD = IDD_ABOUTBOX ; protected: virtual void DoDataExchange(CDataExchange* pdx); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() ; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) void CAboutDlg::DoDataExchange(CDataExchange* pdx) - 122 -

CDialogEx::DoDataExchange(pDX); BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CArithDlg dialog CArithDlg::CArithDlg(CWnd* pparent /*=NULL*/) : CDialogEx(CArithDlg::IDD, pparent), m_nlimit(0) m_hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nradio = 0; m_nanswer = 0; m_strname = _T(""); m_nnum1 = 0; m_nnum2 = 0; void CArithDlg::DoDataExchange(CDataExchange* pdx) CDialogEx::DoDataExchange(pDX); DDX_Radio(pDX, IDC_ADD_RADIO, m_nradio); DDX_Text(pDX, IDC_ANSWER_EDIT, m_nanswer); DDV_MinMaxInt(pDX, m_nanswer, 1, 9999); DDX_Text(pDX, IDC_NAME_EDIT, m_strname); DDV_MaxChars(pDX, m_strname, 10); DDX_Text(pDX, IDC_NUM1_EDIT, m_nnum1); DDX_Text(pDX, IDC_NUM2_EDIT, m_nnum2); BEGIN_MESSAGE_MAP(CArithDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND(ID_EXEC_RENEW, &CArithDlg::OnExecRenew) ON_COMMAND(ID_EXEC_CHANGELEVEL, &CArithDlg::OnExecChangelevel) ON_COMMAND(ID_EXEC_CHECK, &CArithDlg::OnExecCheck) ON_COMMAND(ID_EXIT_QUIT, &CArithDlg::OnExitQuit) ON_COMMAND(ID_EXIT_SAVEANDQUIT, &CArithDlg::OnExitSaveandquit) END_MESSAGE_MAP() - 123 -

// CArithDlg message handlers BOOL CArithDlg::OnInitDialog() CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* psysmenu = GetSystemMenu(FALSE); if (psysmenu!= NULL) BOOL bnamevalid; CString straboutmenu; bnamevalid = straboutmenu.loadstring(ids_aboutbox); ASSERT(bNameValid); if (!straboutmenu.isempty()) psysmenu->appendmenu(mf_separator); psysmenu->appendmenu(mf_string, IDM_ABOUTBOX, straboutmenu); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_nlimit = 9; m_nradio = 0; srand ((int) time (NULL)); m_nnum1 = 1 + rand()%m_nlimit; m_nnum2 = 1 + rand()%m_nlimit; UpdateData (FALSE); return TRUE; // return TRUE unless you set the focus to a control void CArithDlg::OnSysCommand(UINT nid, LPARAM lparam) - 124 -

if ((nid & 0xFFF0) == IDM_ABOUTBOX) CAboutDlg dlgabout; dlgabout.domodal(); else CDialogEx::OnSysCommand(nID, lparam); // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CArithDlg::OnPaint() if (IsIconic()) CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<wparam>(dc.getsafehdc()), 0); // Center icon in client rectangle int cxicon = GetSystemMetrics(SM_CXICON); int cyicon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.width() - cxicon + 1) / 2; int y = (rect.height() - cyicon + 1) / 2; else // Draw the icon dc.drawicon(x, y, m_hicon); CDialogEx::OnPaint(); // The system calls this function to obtain the cursor to display while the user drags // the minimized window. - 125 -

HCURSOR CArithDlg::OnQueryDragIcon() return static_cast<hcursor>(m_hicon); void CArithDlg::OnExecRenew() // TODO: 여기에명령처리기코드를추가합니다. m_nnum1 = 1 + rand()%m_nlimit; m_nnum2 = 1 + rand()%m_nlimit; UpdateData (FALSE); void CArithDlg::OnExecChangelevel() // TODO: 여기에명령처리기코드를추가합니다. m_nlimit = (9 + 99) - m_nlimit; void CArithDlg::OnExecCheck() // TODO: 여기에명령처리기코드를추가합니다. int correct_answer; UpdateData(); if (m_nradio == 0) correct_answer = m_nnum1 + m_nnum2; else correct_answer = m_nnum1 * m_nnum2; if (m_nanswer == correct_answer) MessageBox (_T("Correct. Congratulations, ") + m_strname); else MessageBox (_T("Wrong. Try again, ") + m_strname); void CArithDlg::OnExitQuit() // TODO: 여기에명령처리기코드를추가합니다. OnOK(); void CArithDlg::OnExitSaveandquit() - 126 -

// TODO: 여기에명령처리기코드를추가합니다. OnOK(); 연습문제 본문예제에관한다음지시사항들을수행해보라. 9. 프로그램타이틀캡션이나컨트롤캡션에한글텍스트를입력한후실행시의결과를확인해보라. 10. CWnd:UpdateData() 함수의기능을설명하라? 11. Answer 옆의에디트컨트롤연계변수에 1에서 9999 사이의값으로제한하는 DDV 기능을사용한다음, 실행시범위를벗어나는값을입력해보라. 어느시점에서 DDV 확인이이루어지는지관찰한다음그이유를설명해보라. 12. 라디오버튼그룹에나눗셈을위한라디오버튼을추가하라. 이경우몫과나머지를입력하기위한에디트컨트롤이나타나도록해야한다. ( 참고 : 라디오버튼선택이벤트를나타내는메시지는 ON_BN_CLICKED이다.) 13. 정답출력을위한메뉴항목을추가해보라. 정답을어떤방식으로제시할것인지는스스로결정한다. 14. 라디오버튼그룹을리스트박스컨트롤이나콤보박스컨트롤로대체해보라. 15. 현재는문제를두개의숫자와라디오버튼을이용해나타낸다. 라디오버튼들을없애고문제유형개수만큼의 Renew 메뉴항목을만든다음문제는하나의에디트컨트롤에다음과같은식의형태로나타나게만들어보라. 3 + 4 = 23 * 32 = 34 % 5 = - 127 -