• 검색 결과가 없습니다.

005. 윈도우프로그래밍및실습

N/A
N/A
Protected

Academic year: 2022

Share "005. 윈도우프로그래밍및실습"

Copied!
32
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

1

http://idb.korea.ac.kr DataBase & Mining LAB.

Korea University

005. 윈도우프로그래밍및실습

이 종 욱

5장. 리소스 Resource/ VS 2015

updated 2010. 9. 16 2007. 10. 4

updated 2012. 9. 5 updated 2014. 9. 22 Last updated 2015. 9. 5

(2)

Purpose of this chapter

• What is a ‘Resource’

• How to use the ‘Resource’

Ex) Menu bar

(3)

3

5-1 리소스 분리

 코드 : 데이터를 처리하는 수단

 데이터 : 프로그램의 처리 대상

 개념을 확장 : 코드가 아닌 모든 것을 데이터

 비트맵, 아이콘, 메뉴, 문자열 등등 프로그램의 논리와 무관한 모든 것

 리소스 (Resource) : 메뉴, 비트맵, 엑셀러레이터, 문자열, 아이콘, 커서 등

 별도의 편집기로 만들어져 컴파일되며 링크시에 실행파일에 결합

 장점 : 책 p.123 확인

컴파일 링크

Visual studio: Build

(4)

5-2 메뉴 1: 리소스 작성 준비 (1/2) : 메뉴바를 만들기 위한 시작

1. File/New/ Projects – Win32 Project로 Menu라는 이름의 프로젝트 생성 2. Project/Add New Item – C++ Source File 선택/ Menu.cpp 생성

 apistart.txt 내용 복사해서 Menu.cpp 코드에 추가 (기존 프로젝트 만드는 과정과

현재까지는 동

)

3. 리소스를 코드와 분리하여 관리 및 작성하기 위하여, Menu.rc를 생성해야 한다.

*.rc 파일 생성 방법 1) 메뉴에서 Project/ Add New Item 선택

*.rc 파일 생성 방법 2) Solution Explorer/ Resource Files 선택 후 오른쪽 마우스 클릭/ Add/ New Item

1) 선택

2) 선택

3) Menu.rc 입력

4) 선택

씨디 : Menu.avi 참조 Menu 프로젝트 생성

(5)

5

5-2 메뉴 1: 리소스 작성 준비 (2/2)

1. 리소스를 관리할 수 있는 리소스 탭 추가 되었고, Menu.rc 가 생성되었다.

2. 기존의 코드 중심 내용을 보기 위해서는

Solution Explorer 탭 선택

리소스에 Menu.rc가 추가됨.

resource.h 파일 자동으로 추가됨

(6)

5-2 메뉴 2: 메뉴바 작성을 위한 준비 (1/2)

1. 리소스 탭에서: ch5_Menu 선택/ 오른 쪽 마우스 클릭/ Add/ Resource 선택.

2. 팝업된 Add Resource 창에서, Menu 바를 새로 만들기 위하여 Menu 선택 후 New 클릭

1) 선택

2) 선택

(7)

7

5-2 메뉴 2: 메뉴바 작성을 위한 준비 (2/2)

3. Menu라는 폴더 하단에, 지금 추가한 ‘메 뉴바’를 관리하기 위한 ID가 디폴트로

IDR_MENU1

발급됨.

- ID는 추후 변경 가능

4. 프로그래머가 원하는 메뉴바 내용을 ‘메 뉴바 편집창’에 작성을 한다.

메뉴바 편집창이 활성화 되어 있고, 내가 만든 메뉴의 ID가 발급됨!

 메뉴 편집창이 보이며,

현재 File 을 입력한 모습

(8)

5-2 메뉴 3: 메뉴바 내용 입력 (1/2)

5. File 하단에 Menu1을 입력!

- Menu1의 속성을 추가 및 정정. Properties(속성)창에서 수행.

- Properties 창이 보이지 않으면 vs2015 메뉴바/ View/ Properties Window

 File의 하위 메뉴 Menu1 작성.

-

오른쪽

Menu1

에 대한

속성

값이다.

- 하단에 보면

ID

ID_FILE_MENU1

로 자동 생성된 것을 알 수 있다.(VS 6은 수동 작성) - 화면에 보이는 Menu1이 클릭  프로그램에서 어떤 기능을 수행하기 위해서는 프로그램 내부에서

사용할 이름이 필요. 이 때 사용하는 것이 ID 이다.

ID 이름 설정 규칙!

- 생성하는 메뉴ID는 ID_상위이름_해당메뉴이름 으로 설정한다.(관습적인 규칙)

(9)

9

5-2 메뉴 3: 메뉴바 내용 입력 (2/2)

6. 다음과 같이 메뉴바 내용을 구성하도록 한다!

현재는 메뉴바의 형태만을 만든 것.

따라서,

1)

현재 만든 메뉴바를 윈도우에 포함시키는 과정

2) 어떤 작업을 수행할지 설정해주는 부분이 필요

!!!

(10)

5-2 메뉴 4: 헤더파일 추가 및 클래스 속성 추가(2/2)

7.

menu.cpp 파일에

리소스 헤더(resource.h) 추가 + 클래스 이름에 사용할 문자열 “Menu”로 변경

8. WinMain( ) 함수에서 WndClass 속성을 추가하는 코드에서, 메뉴 ID 등록한다.

 MALEINTRESOURCE( ) 는 리소스가 현재 정수형으로 resource.h에 정의되어

있는 것을 문자열로 변환하는 함수.

(11)

11

5-2 메뉴 5: 메뉴바 실행 결과

프로젝트를 빌드 하고, 실행 화면을 확인한다!!!

* resource.h 파일을 열어보면 다음과 같이 되어 있다.

메뉴 화면에서 만들었던 메뉴 이름에 숫자(정수)가 자동으로 부여되어 있음을 확인 가능

메뉴를 윈도우에 붙이기까지 수행함

(12)

5-2 메뉴 6: 메뉴를 클릭하면 알림창 팝업

 menu.cpp 파일의 메시지 처리 함수 부분에 다음 case 문장을 추가한다!

클릭

(13)

13

5-2 메뉴 7: 메뉴 ID 변경 방법

1) Resource View에서: 현재 메뉴 ID인 IDR_MENU1 선택!

2) Properties 창 확인. 3) ID를 “MyMenu” 로 변경한다. 4) Properties 창에서 변경내용 확인 5) menu.cpp 파일의 WinMain( ) 함수: WndClass 속성 설정 코드에서, 변경된 메뉴 ID 를 반영시킴!

1) 2) 3) 4)

WndClass.lpszClassName=lpszClass;

// WndClass.lpszMenuName=NULL; // 기존에 메뉴바 없었을 때 NULL WndClass.lpszMenuName=_T("MyMenu"); // 다음과 같이 변경한다!!!

5)

※ MAKEINTRESOURCE 를 사용하지 않아도 되는 이유?

(14)

5-2 WM_COMMAND

 사용자가 메뉴 항목을 선택 하면 WM_COMMAND 메시지 발생

 wParam 하위 워드[LOWORD(wParam)]에 선택 메뉴 항목 ID 전달

설명

lParam 통지 메시지를 발생시킨 컨트롤의 윈도우 핸들 LOWORD(wParam) 메뉴나 액셀러레이터, 컨트롤의 ID

HIWORD(wParam) 컨트롤이 보내주는 통지 메시지, 메뉴가 선택된 경우는 0이 되 며 액셀러레이터가 선택된 경우는 1이 된다.

(15)

15

5-2 메뉴 편집기

 메뉴 리소스는 리소스 파일(RC)에 텍스트 형태로 작성하는 것이 원칙 but현재는

비쥬얼한 툴을 이용

 메뉴 작성

 항목 추가

 항목 수정

 항목 중간에 Ins키를 이용 넣기

 항목 삭제 : Del

 하위메뉴가 있으면, 하위 항목도 삭제된다는 경고 메시지 박스 뜸

 메뉴 이동 : 드래그해서 해당 위치로

 복사 및 붙여넣기 : 메뉴 이름등을 복사 해서 붙여넣기 가능

 여러 개 선택 : ctrl, shift 키 이용

(16)

5-3 아이콘, 커서 (1/6): 만들 리소스 선택

 메뉴 프로젝트를 계속해서 이용!!

1) Resource View: Menu.rc 선택/ 오른쪽 마우스 클릭/ Add Resource 선택 2) Add Resource 팝업창: 만들려는 리소스 먼저 Icon 또는 두 번째 Cursor 선택 3) New 클릭

1)

2)

3)

(17)

** Add Resource 창에서

ICON

을 선택했으면!!!

1) Resource View에서: ICON 폴더 및

아이콘 ID: IDI_ICON1

생성되었음 2) 아이콘 편집창에 도구들을 이용하여 아이콘을 그린다.

17

5-3 아이콘, 커서 (2/6): 아이콘 만들기

1)

2) 아이콘 편집창 색상 편집 도구들

편집 도구들

Icon 아이디 부여됨

 16 by 16 사이즈 선택

(18)

** 아이콘 편집창에 도구들을 이용하여 아이콘을 그린다.

5-3 아이콘, 커서 (3/6): 아이콘 만들기

 다음과 같이 작성하면 아이콘 디자인 완료!!!

 완성을 했으면 반드시 Save!!!

또는

 편집창 X 누를 때, 팝업창에서 Yes

(19)

** Add Resource 창에서

Cursor

를 선택했으면!!!

1) Resource View에서: Cursor 폴더 및

커서 ID: IDC_CURSOR1

생성되었음 2) 커서 편집창에 도구들을 이용하여 커서를 그린다.

19

5-3 아이콘, 커서 (4/6): 커서 만들기

색상 2) 아이콘 편집창

편집 도구들

(20)

** 커서 편집창에 도구들을 이용하여 커서를 그린다.

5-3 아이콘, 커서 (5/6): 커서 만들기

 다음과 같이 작성하면 커서 디자인 완료!!!

 완성을 했으면 반드시 Save!!!

 편집창 X 누를 때, 팝업창에서 Yes

(21)

21

5-3 아이콘, 커서 (6/6): menu.cpp 에 등록

** 지금 만든 아이콘과 커서를 프로그램에 등록한다!

자동으로 생성된 아이콘과 커서의 아이디 등록!

- Menu.cpp 코드에서 WndClass 속성 정의 하는 코드를 다음과 같이 변경  재빌드  실행

- 타이틀 바 상단 아이콘 변경 확인!

- 커서는 캡쳐 안됨!

(22)

단축키와 엑셀러레이터

 단축키: 메뉴의 이름이 보이고, 그 일부를 누르면 실행

 엑셀러레이터: 메뉴의 이름이 보이지 않은 상태에서 ‘키 조합(예:

ctrl+c)’을 이용하여 실행

(23)

23

5-3 액셀러레이터 (1/6)

 액셀러레이터

 기존에 작성했던 Menu 프로젝트에 엑셀러레이터 기능을 추가한다!

1) Resource View: “IDR_MENU1” 더블클릭  Menu.rc 편집창 확인!

2) Properties: Menu1, Menu2, Exit의 Caption을 아래 표와 같이 고친 후

저장

!

수정전 수정후

Menu1 Menu&1\tCtrl+A Menu2 Menu&2\tCtrl+B Exit &Exit\tCtrl+C

주의) 안내 문자열만 입력된 상황이다. 별도의 리소스 작업 필요

1) 2)

2-1) 변경

1-1) Menu1 선택 후 속성창 확인

(24)

5-3 액셀러레이터 (2/6): 엑셀러레이터 리소스 등록 설정

3) 메뉴 편집창의 메뉴가 변화된 모습 확인

 엑셀러레이터 실행을 위한 설정 작업을 수행하기 위해 ‘Accelerator’ 리소스 추가!

4) Resource View: menu.rc 선택/ 오른쪽 마우스 클릭/ Add Resource 5) Add Resource 창: Accelerator 선택/ New 클릭

3)

5-1) 5-2)

4)

(25)

25

5-3 액셀러레이터 (3/6): 엑셀러레이터 리소스 등록 설정

6) Resource View 에 ID:

IDR_ACCELLERATOR1

생성 확인 및 Accelerator 편집창 확인

7) Accelerator 편집 및 입력 창: ID, Modifier, Key 부분을 입력 또는 설정한다. Type은 VIRTKEY 그대로 유지.

6) 6) Accelerator 편집 창

7-2)

7-3)

7-4) 최종 완성 모습!!!

// 완성이 되었으면 반드시 저장!!!

// 메뉴의 ID와 엑셀러레이터의 ID를 동일하게 설정함!

7-1)

(26)

5-3 액셀러레이터 (4/6): 엑셀러레이터 menu.cpp 에 코드 추가

 엑셀러레이터 정보를 menu.cpp 코드에 추가해야 한다!

8) menu.cpp 파일 열기: WinMain( ) 함수 변수 선언부분에, 1)엑셀러레이터 핸들 변수 추가 및 2)정 의한 엑셀러레이터를 불어들인다.

8-1) 8-2)

 메시지 얻어왔을 때, 현재 메시지가 기존에 있던 메시지인지 ‘엑셀러레이터에 등록된

메시지’ 인지 구분해야 한다.  메시지 루프 수정

(27)

27

5-3 액셀러레이터 (5/6): 엑셀러레이터 수행 확인

WM_KEYDOWN

WM_COMMAND WM_CHAR

변형 추가 발생 TranslateAccelerator

TranslateMessage

9)

9) 메시지 루프 함수 수정: 키보드에서 입력된 메시지를 정의한 엑셀러레이터 메시지로 변환하기 위한 코드 추가.

(28)

5-3 액셀러레이터 (6/6): 엑셀러레이터 수행 확인

 엑셀러레이터가 수행되는지 확인한다:

Ctrl + A, Ctrl + B, Ctrl + C 각각 수행해본다.

 단축키가 수행되는지 확인한다:

1, 2, E 가 단축키!

// 주의: 단축키 아래에는 _(under bar)가 있어야 하는데? VS2010 이상 버전에서는 출력 안됨!, 실행은 가능 엑셀러레이터 확인: ‘Ctrl + A’ 클릭

단축키 확인: File 선택  ‘2’를 클릭

(29)

29

5-3 문자열 테이블 (1/3)

 윈도우에서는 문자열들도 리소스의 일종으로 취급된다.

 대량의 문자열을 사용하는 프로그램은 리소스에 문자열을 정의해 놓고, 필요할 때마다 리소스 의 문자열을 읽어와 사용한다.

1. StrTable 이름으로 프로젝트를 만든다.

2. StrTable.cpp 코드를 만들고, ApiStart.txt 파일 코드를 옮긴다.

3. StrTable.cpp 코도에 있는 전역변수 lpszClass 문자열을 “StrTable”로 변경.

4. Str.rc 리소스 스크립트 파일 추가

5. 문자열 리소스를 정의하기 위해 리소스 추가 대화상자에서 String Table 선택

5-1)

5-2)

5-3)

StrTable 프로젝트 생성

(30)

5-3 문자열 테이블 (2/3)

int LoadString(HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax);

문자열 리소스를 가진 프로그램 인스턴스 핸들 문자열 ID 문자열을 읽을 버퍼 버퍼의 길이

배열 길이를 초과하는 사고 방지.

** LoadString( ): 리소스에 등록한 문자열 테이블을 읽어오기 위한 함수

 문자열 테이블 편집창 이 부분 클릭

 자동으로 ID 생성됨. 필요에 따라 프로그래머가 이름 입력 가능!

 Caption 부분에 문자열 입력!

(31)

31

5-3 문자열 테이블 (3/3): StrTable.cpp 코드 변경!

헤더 추가 및 프로젝트 문자열 변경

(32)

5-3 문자열 테이블 (3/3): StrTable.cpp 코드 변경!

WndProc( ) 함수 내부 코드 추가!

참조

관련 문서

자기조절과 자기효능감 하위요인이 직무만족에 영향을 미치는 요인을 알아보기 위해 다중 회귀분석을 실시한 결과 자기조절( p=. 005) 이 직무만족을 높여 주는

다음 소개하는 모델링

3) There was a significant difference in the strategy children had utilized to reduce parents' anger according to the gender. In anger situation with

- 융합요리미술 프로그램은 융합 요리미술 프로그램은 기존에 요리미술(요리활동을 통해 미술 의 조형요소와 원리를 발견하고 조형적 아름다움을 표현하는 미술 )에

미국 정부의 천문우주기구인 NASA와 유럽연합의 ESA는 천문대 기사에 필요한 중요한 정보를 무상으로 제공한다.. 동아사이언스 STEAM

마스크를 쓰지 않아요... 미세먼지

PXT(Programming Experience Toolkit)는 Block Editor와 JavaScript를 지원하며, 라디오통신 기능을 추가한 Beta버전의 에 디터로 기존의 Block Editor에

일반적으로 에너지를 변환시킬 때마다 엔트로피가 발생한다... 노동자는 동시에