2011년9월5일_winAPI_리소스, 메뉴만들기 예제
● 리소스(Resource)란?
코드의 논리와 무관한 데이터들로 메뉴, 비트맵, 액셀러레이터, 문자열, 아이콘, 커서등등을 말하고,
리소스들은 별도의 편집기로 만들어져 컴파일되며 링크시에 실행파일에 결합된다.
소스파일 *.cpp와 헤더파일 *.h를 컴파일하여 기계어 코드 *.obj를 만들고,
아이콘파일 *.ico와 그림파일 *.bmp와 리소스파일 *.rc를 컴파일하여 *.res를 만들어,
링크과정에서 exe파일(실행파일)에 결합됨.
★ 윈도우즈 프로그래밍이 도스에서와 구별되는 큰 차이점 중 하나가 바로 리소스가 코드와 분리되어 있다는 점이다.
● 리소스를 소스와 분리하였을 때의 장점 ① 디자이너와 프로그래머가 분담하여 작업하기 편리하다. ② 소스와 리소스를 따로 컴파일하니 개발시간이 단축된다. ③ 만들어진 리소스를 다른 프로젝트에서 쉽게 재사용이 가능하다. ④ 리소스는 실행 중에 교체가 가능한 모듈로 상황에 따라 다른 형태의 리소스를 사용할 수 있다. |
암튼 좋은 것이니 꼭 알아둬야 겠다.
● 메뉴 리소스 작성 과정
VS6.0을 실행한 뒤 Ctrl + N키를 눌러 새로운 프로젝트를 만든다.
프로젝트명은 Menu로 해야 하나 보고서 작성을 위해 새로운 프로젝트를 만드니 2를 붙였다.
당연히 빈 프로젝트 선택하고, 내용은 9월2일 금요일에 작성한 소스코드를 그대로 사용한다.
http://sumanaki.tistory.com/188 <- 여기에 소스코드가 있다.
새로 생성된 프로젝트의 폴더에 복사한 뒤에 소스파일과 헤더파일을 등록한다. (팝업메뉴 - Add file to Folder)
Ctrl + N키를 눌러 새로운 파일을 생성하는데 Resource Script를 선택하여 Menu.rc파일을 만들자.
새로운 창이 뜨고 Menu.rc폴더모양이 보인다.
왼쪽의 Workspace를 보니 리소스파일인데 소스파일폴더에 들어가 버렸다. 이상한데…
rc파일 위에서 오른클릭하여 Insert를 선택하면 오른쪽과 같이 컴포넌트를 선택할 수 있는 창이 뜬다.
Menu를 선택하여 새로 추가하자.
메뉴를 편집할 수 있는 창이 뜬다.
키보드로 “File"이라고 치면 입력이 되고 속성창이 하나 더 뜬다.
메뉴1과 2를 추가한다.
ID는 ID로 시작하고 FILE메뉴의 MENU1이라는 뜻에서 ID_FILE_MENU1이라고 한다. 메뉴2도 마찬가지로 한다.
마지막으로 종료메뉴를 추가하고 ID는 ID_FILE_EXIT로 한다.
이번 프로젝트에 Menu.rc와 resource.h파일이 추가되었다.
제대로 적용되었는지 확인하기 위해 Rebuild All을 한 후에 resource.h파일을 보면,
1: //{{NO_DEPENDENCIES}} 2: // Microsoft Developer Studio generated include file. 3: // Used by Menu.rc 4: // 5: #define IDR_MENU1 101 6: #define ID_FILE_MENU1 40001 7: #define ID_FILE_MENU2 40002 8: #define ID_FILE_EXIT 40003 9:
10: // Next default values for new objects 11: // 12: #ifdef APSTUDIO_INVOKED
13: #ifndef APSTUDIO_READONLY_SYMBOLS
14: #define _APS_NEXT_RESOURCE_VALUE 102 15: #define _APS_NEXT_COMMAND_VALUE 40004 16: #define _APS_NEXT_CONTROL_VALUE 1000 17: #define _APS_NEXT_SYMED_VALUE 101 18: #endif 19: #endif |
// Used by Menu.rc 아래에,
추가한 메뉴들에 대한 값들이 정의되어 있다.
MsgProc.cpp파일을 열어 OnCommand()의 내용을 넣자.
1: LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
2: {
3: switch(LOWORD(wParam)) 4: {
5: case ID_FILE_MENU1: 6: MessageBox(hWnd, TEXT("첫 번째 메뉴를 선택했습니다."), TEXT("Menu Demo"), MB_OK); 7: break; 8: case ID_FILE_MENU2: 9: MessageBox(hWnd, TEXT("두 번째 메뉴를 선택했습니다."), TEXT("Menu Demo"), MB_OK); 10: break; 11: case ID_FILE_EXIT: 12: DestroyWindow(hWnd);
13: break; 14: }
15:
16: return 0; 17: }
|
● 전체소스코드
○ main.cpp
○ MsgProc.h
○ MsgProc.cpp
● 실행결과
파일메뉴의 Menu1을 선택하여 클릭하면 메시지박스가 하나 뜨고,
”첫 번째 메뉴를 선택했습니다”는 확인메시지를 보여 준다.
파일메뉴의 Menu2을 선택하여 클릭하면 메시지박스가 하나 뜨고,
”두 번째 메뉴를 선택했습니다”는 확인메시지를 보여 준다.
마지막으로 Exit를 선택하면 DestroyWindow()가 호출되어 현재 윈도우가 파괴되고 프로그램이 종료된다.