43
1 DB & Mining LAB. Korea University 008. 윈도우프로그래밍 이 종 욱 [email protected] 8장 대화상자 VS 2015 Updated 2010. 10. 23 Updated 2012. 10. 02 Updated 2015. 09. 23

008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

1

DB & Mining LAB.

Korea University

008. 윈도우프로그래밍

이 종 욱

[email protected]

8장 대화상자 VS 2015

Updated 2010. 10. 23

Updated 2012. 10. 02

Updated 2015. 09. 23

Page 2: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

2

8-1 대화상자(1/3)

사용자로부터 끊임없이 지시를 받고 사용자의 지시에 따라 작업을 하고

작업한 결과를 사용자에게 보고한다.

설정된 옵션을 보여주고, 16, 10, 8, 2진수 선택 체크박스를 클릭하면, 거

기에 맞게 숫자 키패드가 활성화되는 양방향 대화

Page 3: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

3

8-1 대화상자(2/3): 모달(Modal), 모델리스(Modaless)

모달(Modal)

• 부모 윈도우 선택 불가

모델리스(Modeless)

• 부모 윈도우 선택 가능

Page 4: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

4

8-1 대화상자(3/3)

대화상자 템플릿

• 대화상자 모양과 대화상자 내의 컨트롤 배치 상태가 저장되는 이진 정보이며 리

소스로 작성된다.

• 개발자 스튜디오 프로그램에 별도의 대화상자 편집기가 제공됨.

대화상자 프로시저

윈도우 프로시저가 윈도우에서 발생하는 메시지를 처리하는 것처럼, 대화상자에

서 발생하는 메시지를 처리

Page 5: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

5

8-1 About 대화상자(1/6): 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 클릭

4) 선택 팝업창 뜸

5-1) 선택

5-2) 선택

About 프로젝트 생성

Page 6: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

6

8-1 About 대화상자(2/6): About 프로젝트 준비

6) IDD_DIALOG1 (디폴트로 주어진)이름을 갖는 컨트롤 도구 모임 열림

VS2015의 메뉴바에서 View/ Toolbox를 선택하여 화면에 Toolbox가 보이도록 한다.

Page 7: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

7

8-1 About 대화상자(3/6): 대화상자 꾸미기

7-1) Toolbox의 ‘Static Text’를 선택하고,

Dialog의 한 부분을 클릭.

7-2) Dialog에 ‘Static’ 이라고 출력됨.

7-3) ‘Static’을 클릭: Properties(속성)창을 확인하면!

- 현재 문자열의 아이디는 IDC_STATIC1

- Caption 부분을 원하는 Text로 변경한다.

- ID 는 디폴트로 IDC_STATIC 사용, -1을 의미

(보여지기만 할 뿐이므로 ID를 통해 구분할 필요가 없다)

주의) 문자열을 추가하면 구분을 위하여,

IDC_STATIC 1부터 숫자가 증가되면서

표시되지만, ID 자체는 IDC_STATIC이다.

7-1)선택

7-2 & 7-3)

7-3) 문자열 ID

7-3) 문자열 캡션 변경

7-3) ID

★ 심플 대화상자(Dialog) 꾸미기 끝

Page 8: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8

8-1 About 대화상자(4/6): About 프로젝트

8) 헤더파일 및 대화상자 프로시저 함수 원형 선언

9) 대화상자 프로시저 작성: 대화상자 내에서 발생하는 메시지를 처리하는 콜백함수.

- 윈도우 프로시저와 개념상 동일한 역할을 하며 받아들이는 인수도 동일

- OK 버튼과 CANCEL 버튼은 디폴트로 제공하는 것이므로, 지정된 ID가 있다.

10) WndProc( ) 함수 작성:

Page 9: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

9

8-1 About 대화상자(5/6): About 프로젝트

// 현재는 다이얼로그에서 크게 해야 할 일이 없다.

// 따라서, OK, CANCEL 버튼의 역할은 단순 종료

Page 10: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

10

8-1 About 대화상자(6/6): About 프로젝트

윈도우에서 마우스 왼쪽 버튼 클릭하면

‘다이얼로그(대화상자)’가 팝업됨!

Page 11: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

11

8-1 대화상자: DialogBox( ) 함수

대화상자를 호출할 때는 DialogBox 함수를 사용

대화상자의 출력, 운영, 종료까지 대화상자에 관한 모든 처리를 담당

int DialogBox( ①HINSTANCE hInstance, ② LPCTSTR lpTemplate,

③HWND hWndParent, ④DLGPROC lpDialogFunc );

① 리소스를 가진 인스턴스의 핸들 ② 대화상자 템플릿 리소스 ID

③ 대화상자를 소유할 부모 윈도우 핸들 ④ 대화상자 프로시저 이름(대화상자와 차일드간의 통신처리)

① ② ③ ④

Page 12: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

12

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)에 통지 코드가 전달

Page 13: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

13

8-1 대화상자 프로시저(2/2)

EndDialog( ) 함수가 호출되면 모달 대화상자가 닫힌다.

2번째 인수를 통해 DialogBox를 호출한 곳에서 대화상자의 어떤 버튼이 눌러졌

는지 알 수 있다.

IDCANCEL 버튼은 파일 헤더에 2로 정의 되어 있다. 추가로 Cancel버튼의 ID

임과 동시에 대화상자의 닫기 버튼(X버튼)의 ID이다. 따라서 IDCANCEL

버튼을 제거하더라도 반드시, IDCancel에 대한 통지 메시지는 처리해야

한다.

BOOL EndDialog(HWND hDlg, int nResult);

Page 14: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

14

8-1 대화상자 단독 생성(1/3): DlgBase 프로젝트

프로그램의 기능이 간단할 경우는 별도의 메인 윈도우 없이 대화상자만으로

프로그램을 구성 가능. 즉 대화상자 자체가 프로그램의 메인 윈도우. 예) 계산기 등

1) DlgBase라는 이름의 프로젝트 생성, DlgBase.cpp 파일 만듦

2) DlgBase.rc 리소스 스크립트 파일 만들고, Add Resource ‘Dialog(대화상자)’ 추가.

3) ToolBox의 ‘Static Text’를 선택하여, Dialog에 간단하게 문장 작성!

4) DlgBase.cpp 를 작성한다.

DlgBase 프로젝트 생성

Page 15: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

15

8-1 대화상자 단독 생성(2/3): DlgBase 프로젝트

DlgBase.cpp 코드 작성!

Page 16: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

16

8-1 대화상자 단독 생성(3/3): DlgBase 프로젝트

// 기존의 WndProc( )는 필요 없고,

// Dialog에서 발생하는 메시지를 처리할

// 프로시져를 제공

Page 17: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

17

8-2 대화상자 작성 : 컨트롤의 종류

Toolbox에는 다양한 Control 들이 있다. 이 중 Dialog를 생성하면 Dialog와 관련한 다양

한 ‘Dialog Editor’가 활성화 된다.

DlgBase 프로젝트의 Dialog에 ToolBox에 있는 다양한 ‘컨트롤’들을 선택하여 추가해본다.

‘Button1’ 컨트롤을 선택하면 ‘Properties’창에 관련 내용이 출력된다!

1)선택

2)클릭하면 버튼이 나타난다.

3)버튼 캡션을 변경한다

4)운영체제가 부여한 ID,

변경 가능!

다양한 Control 종류 확인!

Page 18: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

18

8-2 크기 조정 및 이동

다양한 컨트롤들을 Dialog에 추가해본다!

가이드 선과 격자: 버튼 등의 줄 맞춤 등을 지원하기 위한 아이콘이 보인다. 여러 컨트롤을 ‘Ctrl’

누른 상태에서 선택하면 여러 컨트롤들이 선택된다. 이때 활성화 되며, 각각의 기능을 선택해본다.

버튼을 복사해서 붙여넣기 하면 버튼 텍스트는 같지만 ID는 다르게 부여됨

Page 19: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

19

8-3 컨트롤의 값 읽기(1/5): 핸들과 ID

대화상자는 사용자에게 값을 보여주거나 또는 값을 입력받는 장치이며, 이때 정보 교환의

수단은 에디트나 리스트 박스, 체크 박스 등의 차일드 컨트롤

대화상자 내의 컨트롤들은 ID라는 고유의 이름을 가지는데 CreateWindow 함수로 직접

만들 때는 hMenu 인수로 ID를 지정하며 리소스 편집기를 사용할 때는 속성 대화상자에

서 지정.

차일드 컨트롤의 ID를 알고 있으면 다음 함수로 이 컨트롤의 윈도우 핸들을 구할 수 있다.

윈도우 핸들을 구했으면 GetWindowText( ) 함수로 컨트롤의 내용을 읽을 수도 있고

SetWindowText( )로 변경할 수도 있다. 다음 함수는 GetDlgItem( )의 반대 함수이다.

ID

핸들

GetDlgItem

GetDlgCtrlID

HWND GetDlgItem( HWND hDlg, int nIDDlgItem );

GetDlgItem(hDlg, IDC_EDIT1)

int GetDlgCtrlID( HWND hwndCtl );

왜 ID와 핸들 두가지를 사용하는가?!

Page 20: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

20

8-3 컨트롤의 값 읽기(2/5): 핸들과 ID

시스템은 상황에 따라서 윈도우 핸들 또는 컨트롤 ID를 필요로 함.

윈도우 핸들 요구: ShowWindow or MoveWindow

컨트롤 ID 사용 : 컨트롤의 radio버튼의 경우, 연속된 번호인 ID 이용.

대화상자가 차일드 컨트롤을 프로그래밍 하는 주요 방법은 SendMessage 함수로 메시지

를 보내는 것(윈도우 핸들 요구)

컨트롤 ID만 알고 있다면, GetDlgItem 함수를 이용하여 핸들을 리턴

부모 대화상자의 핸들과 컨트롤의 ID만으로 편리하게 메시지를 보내는 함수를 제공

hDlg 대화상자의 nID컨트롤에게 Msg메시지를 보내는데 GetDlgItem과 SendMessage를

호출하는 래퍼함수

운영체제가 두 함수를 자주 사용하므로, 같이 호출하는 함수 제공

LONG SendDlgItemMessage(HWND hDlg, int nID, UINT Msg, WPARAM wParam, LPARAM lParam);

SendMessage(GetDlgItem(hDlg, ID), … );

Page 21: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

21

8-3 컨트롤의 값 읽기(3/5): 정수와 문자열

컨트롤에 입력한 데이터(정수, 문자열)를 Dialog에서 읽거나 출력해야 할 때!

문자열값을 교환하는 함수

컨트롤로부터 문자열을 읽는 함수

컨트롤로 문자열을 출력하는 함수

정수값을 교환하는 함수

컨트롤로부터 정수값을 읽는 함수

컨트롤로 정수값을 출력하는 함수

UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount );

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 );

①대화상자 윈도우 핸들, ②읽거나 쓸 컨트롤 ID, ③읽거나 쓸 문자열, ④ 문자열 길이

① 대화상자 윈도우 핸들, ② 읽거나 쓸 컨트롤 ID, ③ 에러 존재 여부 or NULL/ 정수값 대입,

④ T : 부호 있는 정수, F : 부호 무시 (양수)

Get

Set

Int

Text DlgItem

Page 22: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 컨트롤의 값 읽기(4/5): 나이값 표현

나이값을 표현하는 Age 변수의 값을 IDC_EDIT1이라는 에디트 컨트롤에 출력

다음과 같이 코드 작성!

22

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);

……

Page 23: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

23

8-3 컨트롤의 값 읽기(5/5): 논리형

BOOL형 : 두 값 중 하나를 표현. 체크 박스로 표시하는 것이 적합

열거형 : 여러가지 값 중 하나를 선택받음. 라디오 버튼이나 리스트 박스

bBold라는 변수의 값을 IDC_BOLD라는 체크 박스에 표시하고 싶다.

• p.241 확인

• bBold 가 TRUE이면 IDC_BOLD 체크박스가 체크된다

• SendMessage를 보내 체크되어 있지 않으면 체크하고, 변경하는 것과 같다

BOOL CheckDlgButton( HWND hDlg, int nIDDlgItem, UINT uCheck );

UINT IsDlgButtonChecked(HWND hDlg, int nIDButton );

CheckDlgButton( hDlg, IDC_BOLD, bBold ? BST_CHECKED : BST_UNCHECKED );

Page 24: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

24

8-3 InfoDlg(1/6): p.242

대화상자에 “현재 윈도우 화면 100, 100 위치에 String” 이라는 내용(x,y 위치와

str 내용)을 보여주고, 사용자가 대화상자를 통해 값을 변경하는 프로그램 작성!

1) 왼쪽 마우스 클릭 2) Edit 내용 변경 후 OK! 클릭 3) 화면 출력 변경됨!

Page 25: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 InfoDlg(2/6)

1. InfoDlg 프로젝트를 만들고, InfoDlg.cpp 파일을 만든다. Apistart.txt를 복사해

InfoDlg.cpp에 추가한다.

2. lpszClass를 “InfoDlg”로 수정.

3. InfoDlg.rc 파일을 만든다.

4. ‘Add Resource’ 선택

5. 창에서 Dialog 선택 New 클릭

25

4) 선택

5-1)

5-2)

InforDlg 프로젝트 생성

Page 26: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 InfoDlg(3/6)

6. ‘Edit Control’과 ‘Static Text’를 이용하여, 다음과 같이 ‘Dialog Box(대화상자)’를 디자인.

7. ‘Edit’ 창을 선택하고, ‘Properties’창에서 Edit의 ID를 설정한다.

26

7-1) 선택

7-2) ID 변경

X: 옆 에디트 ID IDC_X

Y: 옆 에디트 ID IDC_Y

Str: 옆 에디트 ID IDC_STR

Page 27: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 InfoDlg(4/6)

8. InfoDlg.cpp 코드를 작성한다. 헤더파일, 다이얼로그 프로시저 함수 선언, lpszClass, 전역변

수를 추가한다.

27

Page 28: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 InfoDlg(5/6)

28

// 다이얼 로그 아이디는 IDD_DIALOG1 디폴트를 이용

// OK 버튼 눌러졌을 때, 화면에 변화가 있음을 강제로 알린다.

9. InfoDlgProc( ) 함수 작성

Page 29: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

29

8-3 InfoDlg(6/6)

10. WndProc( ) 함수를 작성

Page 30: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 DlgCheck(1/4): p.245

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 설정

30

남자 IDC_MALE

경영학과 IDC_MAJOR1

국문학과 IDC_MAJOR2

영문학과 IDC_MAJOR3

법학과 IDC_MAJOR4 1) 기본값 출력

-왼쪽마우스클릭

2) 윈도우 내용 반영한 내용 출력, 원하는 옵션으로 변경

3) 변경 내용 출력

DlgCheck 프로젝트 생성

Page 31: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 DlgCheck(2/4)

헤더파일, 함수 선언, 전역변수 등 추가

31

Page 32: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 DlgCheck(3/4):

DlgProc( ) 함수 정의

32

// Radio 버튼이 많아지면, 일일이 코드를 작성하는 것보다

// for문을 이용한 함수를 만드는 것이 보다 더 효과적이다.

// 교재 p.247 참조

Page 33: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-3 DlgCheck(4/4):

WndProc( ) 함수 정의

33

Page 34: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(1/9)

모델리스형은 대화상자를 열어놓은 채로 메인 윈도우 조작 가능

1. InfoDlg 폴더를 통째로 복사한 후 폴더 이름을 Mless로 바꾼다.(실습을 손쉽게 하기 위함)

- 복사한 폴더의 이름을 변경한 후, 해당 폴더에서 다음 프로젝트 실행.

34

InfoDlg 프로젝트 폴더 복사 Mless 프로젝트로 변경

Page 35: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(2/9)

2. 프로젝트 이름 및 관련 파일 이름 변경: ‘Solution Explorer’의 Solution ‘InfoDlg’의 오른쪽

마우스 클릭 Rename: Mless

주의) 4 군데 이름을 변경한 후 저장 반드시 프로젝트를 종료하고 다시 시작 실행!

35

변경된 내용

InfoDlg 프로젝트 폴더 복사 Mless 프로젝트로 변경

1, 2

3

4

Page 36: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

3. a) Mless.cpp 실행 후 LPCTSTR lpszClass=_T(“Mless”); 로 변경.

b) 모델리스 다이얼로그를 관리할 핸들 전역변수로 선언

c) 기존에 선언되어 있던 InfoDlgProc( ) 함수 선언을 삭제하고 MlessDlgProc( ) 함수 선언.

8-4. 모델리스형 대화상자(3/9)

36

Page 37: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

4. WndProc()의 ‘왼쪽 마우스 버튼을 클릭’ 이벤트에 대한 코드를 하단과 같이 변경.

8-4. 모델리스형 대화상자(4/9)

37

모델리스는 부모 윈도우 위에 출력되는 것이 아닌 별개의 윈도우 출력으로 취급!

따라서 Create, Show 과정을 수행

CreateDialog( )함수 : 대화상자를 만들고 핸들을 리턴, 대화상자 운영과는 관련 없음

기존 모달형 대화상자는 DialogBox( ) 사용: 대화상자에서 발생한 일들을 처리하기 전에는 리턴 하지 않음

// Dialog 처리 함수 이름 MlessDlgProc

// 기존 코드!

// 수정한 코드!

Page 38: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(5/9): Dialog 버튼 캡션 수정 및 ID 변경

38

1) 캡션 수정

2) OK 클릭 및 캡션 수정

5. Resource View에서 다이얼로그 선택하여 수정

2-1) ID_CHANGE 로 ID 수정

3) Cancle 클릭 및 캡션 수정

3-1) ID_CLOSE로 ID 수정

변경된 내용

// 수정된 내용 저장

// resource.h 에

변경된 내용 확인

Page 39: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(6/9): MlessDlgProc( ) 함수 변경

39

6. 기존 대화상자 프로시저 InfoDlgProc을 MlessDlgProc( ) 로 변경 후

함수 정의 내부 수정.

IDCANCEL 의 역할이 ID_CLOSE와 같으므로 case에 해당하는 statement(문장)이 없다.

Page 40: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(7/9)

6. WinMain( )의 메시지 루프를 다음과 같이 변경한다.

40

IsDialogMessage( )

1) 메시지가 대화상자를 위한 메시지 인지 검사 후, 해당 메시지를 대화상자로 보낸다

2) 메시지를 처리한 후 TRUE리턴, 대화상자와 관련 없는 메시지일 때는 FALSE 리턴

Page 41: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(8/9): 코드 분석

모델리스형 대화상자 만들 때 주의할 점.

대화상자가 두 번 만들어지지 않아야 함.

WM_LBUTTONDOWN 메시지에서 대화상자를 만들기 전에 hMDlg, 즉 대화상자의

윈도우 핸들을 조사해 보고 이 핸들이 유효한 윈도우 핸들인지를 먼저 점검

윈도우 존재하면 True, 존재하지 않으면 False 리턴

IsWindow( )함수를 이용하여 유효성 판별.

다이얼로그를 관리하기 위한 핸들은 미리 전역 변수로 선언한다.

41

BOOL IsWindow(HWND hWnd);

Page 42: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

8-4. 모델리스형 대화상자(9/9): 코드 분석

모달형은 OK, Cancel 버튼 사용

OK는 입력한 값들을 받아들임, Cancle은 입력한 값들을 버림

두 버튼 모두 대화상자를 종료한다.

모델리스형

대화상자가 항상 열려 있다.

모달과는 달리 수행되는 모델리스에 맞는 ID로 변경해준다!!

Change 버튼 : 대화상자를 열어놓은 채로 값을 변경

Close 버튼 : 대화상자를 닫음.

42

버튼 ID Caption

OK ID_CHANGE Change

Cancel ID_CLOSE Close

Page 43: 008. 윈도우프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2015/korea_sejong/... · 8-4. 모델리스형 대화상자(1/9) 모델리스형은 대화상자를 열어놓은

모달리스 대화상자

Visible 속성을 Check하여야 한다.

메시지는 프로그램의 메시지 큐를 통해서 들어온다.

메시지 루프 루틴을 변경해야 한다.

IsDialogMessage(hDlgModeless, & msg)

모달리스 메시지이면 대화상자 윈도우 프로시저에 메시지를 전달, Return TRUE

EndDialog대신 DestroyWindow를 사용.

DialogBox() CreateDialog()

종료후 리턴 바로 리턴