윈도우즈 프로그래밍

Similar documents
Microsoft PowerPoint - 09-CE-5-윈도우 핸들

04장 메시지 처리 유형

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

1장 윈도우 프로그래밍 들어가기

윈도우즈 프로그래밍

Microsoft PowerPoint - 04windows.ppt

윈도우시스템프로그래밍

Visual Basic 반복문

윈도우시스템프로그래밍

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

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

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

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

Microsoft Word - src.doc

MFC 프로그래밍

윈도우 프로그래밍의 개념

PowerPoint Template

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

윈도우즈 프로그래밍

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

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

Microsoft PowerPoint - chap06-2pointer.ppt

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

PowerPoint Template

tiawPlot ac 사용방법

5장 MFC기반 다지기

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

Windows 8에서 BioStar 1 설치하기

PowerPoint Presentation

PowerPoint 프레젠테이션

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

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

슬라이드 1

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - e pptx

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

슬라이드 1

OCW_C언어 기초

슬라이드 1

슬라이드 1

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

Visual Basic Visual Basic 소개

Microsoft PowerPoint - hci2-lecture1.ppt

Database Design Lab: MS Access Queries 1. Download lab6.accdb and rename it to lab7.accdb. 2. 이름 값을가지는쿼리 qryauthor 를만든다 a) Open lab6.accdb. b) 리본메뉴 만들

Microsoft PowerPoint - hci2-lecture9.ppt

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

윈도우시스템프로그래밍

제8장 자바 GUI 프로그래밍 II

Programming hwp

윈도우즈 프로그래밍

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap06-1Array.ppt

Studuino소프트웨어 설치

윈도우시스템프로그래밍

Chapter 1. MFC 시작하기

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

게임 기획서 표준양식 연구보고서

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

윈도우 프로그래밍의 개념

UI TASK & KEY EVENT

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

C. KHU-EE xmega Board 에서는 Button 을 2 개만사용하기때문에 GPIO_PUSH_BUTTON_2 과 GPIO_PUSH_BUTTON_3 define 을 Comment 처리 한다. D. AT45DBX 도사용하지않기때문에 Comment 처리한다. E.

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

강의 개요

소프트웨어공학 Tutorial #2: StarUML Eun Man Choi

Microsoft PowerPoint - hci2-lecture1.ppt

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

DLL(Dynamic Linked Library)

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

11장 포인터

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft PowerPoint 웹 연동 기술.pptx

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

MF3010 MF Driver Installation Guide

슬라이드 제목 없음

JDK이클립스

Chapter #01 Subject

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

2014 년정보보호졸업작품보고서 파일유출방지시스템 지도교수님 : 양환석교수님 팀명 : LKC Security 팀원 : 이호영, 김상우, 최유택 중부대학교정보보호학과

학습목표 텍스트파일을다룰수있다. 스트림읽기, 쓰기를안다. 2

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

윈도우 프로그래밍

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

PowerPoint Presentation

어댑터뷰

Multi-pass Sieve를 이용한 한국어 상호참조해결 반-자동 태깅 도구

KEB 외국환 서식관리 프로그램 사용자 메뉴얼

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

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

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft PowerPoint - C++ 5 .pptx

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Transcription:

8 장대화상자 VS 2015 008. 윈도우프로그래밍 DB & Mining LAB. Korea University Updated 2010. 10. 23 Updated 2012. 10. 02 Updated 2015. 09. 23 이종욱 eastwest9@korea.ac.kr 1

8-1 대화상자 (1/3) 사용자로부터끊임없이지시를받고사용자의지시에따라작업을하고 작업한결과를사용자에게보고한다. 설정된옵션을보여주고, 16, 10, 8, 2 진수선택체크박스를클릭하면, 거 기에맞게숫자키패드가활성화되는양방향대화 2

8-1 대화상자 (2/3): 모달 (Modal), 모델리스 (Modaless) 모달 (Modal) 부모윈도우선택불가 모델리스 (Modeless) 부모윈도우선택가능 3

8-1 대화상자 (3/3) 대화상자템플릿 대화상자모양과대화상자내의컨트롤배치상태가저장되는이진정보이며리소스로작성된다. 개발자스튜디오프로그램에별도의대화상자편집기가제공됨. 대화상자프로시저 윈도우프로시저가윈도우에서발생하는메시지를처리하는것처럼, 대화상자에 서발생하는메시지를처리 4

8-1 About 대화상자 (1/6): About 프로젝트준비 About 프로젝트생성 1) About 프로젝트만든다. 2) Add New Item: About.cpp 만들고, ApiStart.txt 내용을 About.cpp로복사한다. - 코드에서, lpszclass의문자열부분을 _T( About ) 으로변경 3) Add New Item: About.rc 리소스스크립트파일을만든다. 4) Resource View 창에서, About.rc 오른쪽마우스클릭 Add Resource 5) Add Resource 창에서, Dialog 선택 New 클릭 5-2) 선택 5-1) 선택 4) 선택 팝업창뜸 5

8-1 About 대화상자 (2/6): About 프로젝트준비 6) IDD_DIALOG1 ( 디폴트로주어진 ) 이름을갖는컨트롤도구모임열림 VS2015 의메뉴바에서 View/ Toolbox 를선택하여화면에 Toolbox 가보이도록한다. 6

8-1 About 대화상자 (3/6): 대화상자꾸미기 7-2 & 7-3) 7-1) Toolbox 의 Static Text 를선택하고, Dialog 의한부분을클릭. 7-1) 선택 7-2) Dialog 에 Static 이라고출력됨. 7-3) Static 을클릭 : Properties( 속성 ) 창을확인하면! - 현재문자열의아이디는 IDC_STATIC1 - Caption 부분을원하는 Text로변경한다. - ID 는디폴트로 IDC_STATIC 사용, -1을의미 ( 보여지기만할뿐이므로 ID를통해구분할필요가없다 ) 7-3) 문자열 ID 7-3) 문자열캡션변경 주의 ) 문자열을추가하면구분을위하여, IDC_STATIC 1 부터숫자가증가되면서 표시되지만, ID 자체는 IDC_STATIC 이다. 7-3) ID 심플대화상자 (Dialog) 꾸미기끝 7

8-1 About 대화상자 (4/6): About 프로젝트 8) 헤더파일및대화상자프로시저함수원형선언 9) 대화상자프로시저작성 : 대화상자내에서발생하는메시지를처리하는콜백함수. - 윈도우프로시저와개념상동일한역할을하며받아들이는인수도동일 - OK 버튼과 CANCEL 버튼은디폴트로제공하는것이므로, 지정된 ID가있다. 10) WndProc( ) 함수작성 : 8

8-1 About 대화상자 (5/6): About 프로젝트 // 현재는다이얼로그에서크게해야할일이없다. // 따라서, OK, CANCEL 버튼의역할은단순종료 9

8-1 About 대화상자 (6/6): About 프로젝트 윈도우에서마우스왼쪽버튼클릭하면 다이얼로그 ( 대화상자 ) 가팝업됨! 10

8-1 대화상자 : DialogBox( ) 함수 대화상자를호출할때는 DialogBox 함수를사용 대화상자의출력, 운영, 종료까지대화상자에관한모든처리를담당 int DialogBox( 1HINSTANCE hinstance, 2 LPCTSTR lptemplate, 3HWND hwndparent, 4DLGPROC lpdialogfunc ); 1 리소스를가진인스턴스의핸들 2 대화상자템플릿리소스 ID 3 대화상자를소유할부모윈도우핸들 4 대화상자프로시저이름 ( 대화상자와차일드간의통신처리 ) 1 2 3 4 11

8-1 대화상자프로시저 (1/2) 대화상자프로시저와윈도우프로시저의차이점 윈도우프로시저 LRESULT(long) 형리턴, 대화상자프로시저 BOOL형리턴 윈도우프로시저는메시지를처리하면 0을리턴 OR DefWindowProc에게메시지를보낸다 대화상자프로시저는바르게처리하면 TRUE, 처리하지못하면 FALSE 리턴, 나머지는운영체제가알아서 default 처리. 대화상자프로시저는관심없는메시지에대해 FALSE 리턴 대화상자프로시저는 WM_CREATE 메시지대신 WM_INITDIALOG메시지를통해초기화. About 예제는특별히초기화할것없으므로 TRUE만리턴 대화상자프로시저에서 WM_COMMAND는대화상자에서컨트롤이나메뉴항목이선택될경우컨트롤들이부모윈도우인대화상자로보내는통지메시지 LOWORD(wParam) 에메시지를보낸컨트롤의 ID 전달 HIWORD(wParam) 에통지코드가전달 12

8-1 대화상자프로시저 (2/2) BOOL EndDialog(HWND hdlg, int nresult); EndDialog( ) 함수가호출되면모달대화상자가닫힌다. 2 번째인수를통해 DialogBox 를호출한곳에서대화상자의어떤버튼이눌러졌 는지알수있다. IDCANCEL 버튼은파일헤더에 2로정의되어있다. 추가로 Cancel버튼의 ID 임과동시에대화상자의닫기버튼 (X버튼) 의 ID이다. 따라서 IDCANCEL 버튼을제거하더라도반드시, IDCancel에대한통지메시지는처리해야한다. 13

8-1 대화상자단독생성 (1/3): DlgBase 프로젝트 DlgBase 프로젝트생성 프로그램의기능이간단할경우는별도의메인윈도우없이대화상자만으로 프로그램을구성가능. 즉대화상자자체가프로그램의메인윈도우. 예 ) 계산기등 1) DlgBase라는이름의프로젝트생성, DlgBase.cpp 파일만듦 2) DlgBase.rc 리소스스크립트파일만들고, Add Resource Dialog( 대화상자 ) 추가. 3) ToolBox의 Static Text 를선택하여, Dialog에간단하게문장작성! 4) DlgBase.cpp 를작성한다. 14

8-1 대화상자단독생성 (2/3): DlgBase 프로젝트 DlgBase.cpp 코드작성! 15

8-1 대화상자단독생성 (3/3): DlgBase 프로젝트 // 기존의 WndProc( ) 는필요없고, // Dialog 에서발생하는메시지를처리할 // 프로시져를제공 16

8-2 대화상자작성 : 컨트롤의종류 다양한 Control 종류확인! Toolbox 에는다양한 Control 들이있다. 이중 Dialog 를생성하면 Dialog 와관련한다양 한 Dialog Editor 가활성화된다. DlgBase 프로젝트의 Dialog 에 ToolBox 에있는다양한 컨트롤 들을선택하여추가해본다. Button1 컨트롤을선택하면 Properties 창에관련내용이출력된다! 2) 클릭하면버튼이나타난다. 1) 선택 3) 버튼캡션을변경한다 4) 운영체제가부여한 ID, 변경가능! 17

8-2 크기조정및이동 다양한컨트롤들을 Dialog 에추가해본다! 가이드선과격자 : 버튼등의줄맞춤등을지원하기위한아이콘이보인다. 여러컨트롤을 Ctrl 누른상태에서선택하면여러컨트롤들이선택된다. 이때활성화되며, 각각의기능을선택해본다. 버튼을복사해서붙여넣기하면버튼텍스트는같지만 ID 는다르게부여됨 18

8-3 컨트롤의값읽기 (1/5): 핸들과 ID 대화상자는사용자에게값을보여주거나또는값을입력받는장치이며, 이때정보교환의수단은에디트나리스트박스, 체크박스등의차일드컨트롤대화상자내의컨트롤들은 ID라는고유의이름을가지는데 CreateWindow 함수로직접만들때는 hmenu 인수로 ID를지정하며리소스편집기를사용할때는속성대화상자에서지정. 차일드컨트롤의 ID 를알고있으면다음함수로이컨트롤의윈도우핸들을구할수있다. HWND GetDlgItem( HWND hdlg, int niddlgitem ); GetDlgItem(hDlg, IDC_EDIT1) 윈도우핸들을구했으면 GetWindowText( ) 함수로컨트롤의내용을읽을수도있고 SetWindowText( ) 로변경할수도있다. 다음함수는 GetDlgItem( ) 의반대함수이다. int GetDlgCtrlID( HWND hwndctl ); ID GetDlgItem GetDlgCtrlID 핸들 왜 ID 와핸들두가지를사용하는가?! 19

8-3 컨트롤의값읽기 (2/5): 핸들과 ID 시스템은상황에따라서윈도우핸들또는컨트롤 ID 를필요로함. 윈도우핸들요구 : ShowWindow or MoveWindow 컨트롤 ID 사용 : 컨트롤의 radio 버튼의경우, 연속된번호인 ID 이용. 대화상자가차일드컨트롤을프로그래밍하는주요방법은 SendMessage 함수로메시지 를보내는것 ( 윈도우핸들요구 ) 컨트롤 ID 만알고있다면, GetDlgItem 함수를이용하여핸들을리턴 SendMessage(GetDlgItem(hDlg, ID), ); 부모대화상자의핸들과컨트롤의 ID 만으로편리하게메시지를보내는함수를제공 LONG SendDlgItemMessage(HWND hdlg, int nid, UINT Msg, WPARAM wparam, LPARAM lparam); hdlg 대화상자의 nid 컨트롤에게 Msg 메시지를보내는데 GetDlgItem 과 SendMessage 를 호출하는래퍼함수 운영체제가두함수를자주사용하므로, 같이호출하는함수제공 20

8-3 컨트롤의값읽기 (3/5): 정수와문자열 컨트롤에입력한데이터 ( 정수, 문자열 ) 를 Dialog 에서읽거나출력해야할때! 문자열값을교환하는함수 컨트롤로부터문자열을읽는함수 Get Set DlgItem Int Text 컨트롤로문자열을출력하는함수 UINT GetDlgItemText( HWND hdlg, int niddlgitem, LPTSTR lpstring, int nmaxcount ); 1 대화상자윈도우핸들, 2 읽거나쓸컨트롤 ID, 3 읽거나쓸문자열, 4 문자열길이 BOOL SetDlgItemText( HWND hdlg, int niddlgitem, LPCTSTR lpstring ); 정수값을교환하는함수 컨트롤로부터정수값을읽는함수 컨트롤로정수값을출력하는함수 UINT GetDlgItemInt( HWND hdlg, int niddlgitem, BOOL *lptranslated, BOOL bsigned ); BOOL SetDlgItemInt( HWND hdlg, int niddlgitem, UINT uvalue, BOOL bsigned ); 1 대화상자윈도우핸들, 2 읽거나쓸컨트롤 ID, 3 에러존재여부 or NULL/ 정수값대입, 4 T : 부호있는정수, F : 부호무시 ( 양수 ) 21

8-3 컨트롤의값읽기 (4/5): 나이값표현 나이값을표현하는 Age 변수의값을 IDC_EDIT1 이라는에디트컨트롤에출력 다음과같이코드작성! switch (imessage){ case WM_INITDIALOG: SetDlgItemInt(hDlg, IDC_EDIT1, Age, FALSE); return TRUE; case WM_COMMAND: switch(loword(wparam)){ case IDOK: Age=GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE); 22

8-3 컨트롤의값읽기 (5/5): 논리형 BOOL 형 : 두값중하나를표현. 체크박스로표시하는것이적합 열거형 : 여러가지값중하나를선택받음. 라디오버튼이나리스트박스 BOOL CheckDlgButton( HWND hdlg, int niddlgitem, UINT ucheck ); UINT IsDlgButtonChecked(HWND hdlg, int nidbutton ); bbold 라는변수의값을 IDC_BOLD 라는체크박스에표시하고싶다. p.241 확인 CheckDlgButton( hdlg, IDC_BOLD, bbold? BST_CHECKED : BST_UNCHECKED ); bbold 가 TRUE 이면 IDC_BOLD 체크박스가체크된다 SendMessage 를보내체크되어있지않으면체크하고, 변경하는것과같다 23

8-3 InfoDlg(1/6): p.242 대화상자에 현재윈도우화면 100, 100 위치에 String 이라는내용 (x,y 위치와 str 내용 ) 을보여주고, 사용자가대화상자를통해값을변경하는프로그램작성! 1) 왼쪽마우스클릭 2) Edit 내용변경후 OK! 클릭 3) 화면출력변경됨! 24

8-3 InfoDlg(2/6) InforDlg 프로젝트생성 1. InfoDlg 프로젝트를만들고, InfoDlg.cpp 파일을만든다. Apistart.txt를복사해 InfoDlg.cpp에추가한다. 2. lpszclass를 InfoDlg 로수정. 3. InfoDlg.rc 파일을만든다. 4. Add Resource 선택 5. 창에서 Dialog 선택 New 클릭 4) 선택 5-2) 5-1) 25

8-3 InfoDlg(3/6) 6. Edit Control 과 Static Text 를이용하여, 다음과같이 Dialog Box( 대화상자 ) 를디자인. 7. Edit 창을선택하고, Properties 창에서 Edit 의 ID 를설정한다. 7-1) 선택 X: 옆에디트 ID IDC_X Y: 옆에디트 ID IDC_Y Str: 옆에디트 ID IDC_STR 7-2) ID 변경 26

8-3 InfoDlg(4/6) 8. InfoDlg.cpp 코드를작성한다. 헤더파일, 다이얼로그프로시저함수선언, lpszclass, 전역변 수를추가한다. 27

8-3 InfoDlg(5/6) 9. InfoDlgProc( ) 함수작성 // 다이얼로그아이디는 IDD_DIALOG1 디폴트를이용 // OK 버튼눌러졌을때, 화면에변화가있음을강제로알린다 28

8-3 InfoDlg(6/6) 10. WndProc( ) 함수를작성 29

8-3 DlgCheck(1/4): p.245 DlgCheck 프로젝트생성 InfoDlg 와비슷하지만입력받는값이 BOOL 형과열거형 1. DlgCheck 프로젝트를만들고, DlgCheck.cpp 파일을만든다. Apistart.txt를복사해 DlgCheck.cpp에추가. 2. DlgCheck.rc 파일을만든다. 3. Add Resource 선택, 창에서 Dialog 선택 Dialog Check 와같이다이얼로그를디자인한다. ToolBox 에서 Check Box, Group Box, Radio Button : Properties 창의캡션에서각각의내 용에맞게변경및 ID 설정 남자 IDC_MALE 경영학과 IDC_MAJOR1 국문학과 IDC_MAJOR2 영문학과 IDC_MAJOR3 1) 기본값출력 - 왼쪽마우스클릭 3) 변경내용출력 법학과 IDC_MAJOR4 2) 윈도우내용반영한내용출력, 원하는옵션으로변경 30

8-3 DlgCheck(2/4) 헤더파일, 함수선언, 전역변수등추가 31

8-3 DlgCheck(3/4): DlgProc( ) 함수정의 // Radio 버튼이많아지면, 일일이코드를작성하는것보다 // for 문을이용한함수를만드는것이보다더효과적이다. // 교재 p.247 참조 32

8-3 DlgCheck(4/4): WndProc( ) 함수정의 33

8-4. 모델리스형대화상자 (1/9) InfoDlg 프로젝트폴더복사 Mless 프로젝트로변경 모델리스형은대화상자를열어놓은채로메인윈도우조작가능 1. InfoDlg 폴더를통째로복사한후폴더이름을 Mless 로바꾼다.( 실습을손쉽게하기위함 ) - 복사한폴더의이름을변경한후, 해당폴더에서다음프로젝트실행. 34

8-4. 모델리스형대화상자 (2/9) InfoDlg 프로젝트폴더복사 Mless 프로젝트로변경 2. 프로젝트이름및관련파일이름변경 : Solution Explorer 의 Solution InfoDlg 의오른쪽 마우스클릭 Rename: Mless 주의 ) 4 군데이름을변경한후저장 반드시프로젝트를종료하고다시시작 실행! 1, 2 3 4 변경된내용 35

8-4. 모델리스형대화상자 (3/9) 3. a) Mless.cpp 실행후 LPCTSTR lpszclass=_t( Mless ); 로변경. b) 모델리스다이얼로그를관리할핸들전역변수로선언 c) 기존에선언되어있던 InfoDlgProc( ) 함수선언을삭제하고 MlessDlgProc( ) 함수선언. 36

8-4. 모델리스형대화상자 (4/9) 4. WndProc() 의 왼쪽마우스버튼을클릭 이벤트에대한코드를하단과같이변경. // 기존코드! // 수정한코드! // Dialog 처리함수이름 MlessDlgProc 모델리스는부모윈도우위에출력되는것이아닌별개의윈도우출력으로취급! 따라서 Create, Show 과정을수행 CreateDialog( ) 함수 : 대화상자를만들고핸들을리턴, 대화상자운영과는관련없음 기존모달형대화상자는 DialogBox( ) 사용 : 대화상자에서발생한일들을처리하기전에는리턴하지않음 37

8-4. 모델리스형대화상자 (5/9): Dialog 버튼캡션수정및 ID 변경 5. Resource View 에서다이얼로그선택하여수정 1) 캡션수정 변경된내용 2) OK 클릭및캡션수정 3) Cancle 클릭및캡션수정 // 수정된내용저장 // resource.h 에 변경된내용확인 2-1) ID_CHANGE 로 ID 수정 3-1) ID_CLOSE 로 ID 수정 38

8-4. 모델리스형대화상자 (6/9): MlessDlgProc( ) 함수변경 6. 기존대화상자프로시저 InfoDlgProc 을 MlessDlgProc( ) 로변경후 함수정의내부수정. IDCANCEL 의역할이 ID_CLOSE 와같으므로 case 에해당하는 statement( 문장 ) 이없다. 39

8-4. 모델리스형대화상자 (7/9) 6. WinMain( ) 의메시지루프를다음과같이변경한다. IsDialogMessage( ) 1) 메시지가대화상자를위한메시지인지검사후, 해당메시지를대화상자로보낸다 2) 메시지를처리한후 TRUE 리턴, 대화상자와관련없는메시지일때는 FALSE 리턴 40

8-4. 모델리스형대화상자 (8/9): 코드분석 모델리스형대화상자만들때주의할점. 대화상자가두번만들어지지않아야함. WM_LBUTTONDOWN 메시지에서대화상자를만들기전에 hmdlg, 즉대화상자의윈도우핸들을조사해보고이핸들이유효한윈도우핸들인지를먼저점검 BOOL IsWindow(HWND hwnd); 윈도우존재하면 True, 존재하지않으면 False 리턴 IsWindow( ) 함수를이용하여유효성판별. 다이얼로그를관리하기위한핸들은미리전역변수로선언한다. 41

8-4. 모델리스형대화상자 (9/9): 코드분석 모달형은 OK, Cancel 버튼사용 OK 는입력한값들을받아들임, Cancle 은입력한값들을버림 두버튼모두대화상자를종료한다. 모델리스형 대화상자가항상열려있다. 모달과는달리수행되는모델리스에맞는 ID로변경해준다!! Change 버튼 : 대화상자를열어놓은채로값을변경 Close 버튼 : 대화상자를닫음. 버튼 ID Caption OK ID_CHANGE Change Cancel ID_CLOSE Close 42

모달리스대화상자 DialogBox() 종료후리턴 CreateDialog() 바로리턴 Visible 속성을 Check하여야한다. 메시지는프로그램의메시지큐를통해서들어온다. 메시지루프루틴을변경해야한다. IsDialogMessage(hDlgModeless, & msg) 모달리스메시지이면대화상자윈도우프로시저에메시지를전달, Return TRUE EndDialog대신 DestroyWindow를사용.