본문 바로가기

공부/윈도우api

[윈도우api] 리소스

반응형

 

 

#include "resource.h"

 

WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch(iMessage) {

case WM_COMMAND:

     switch(LOWORD(wParam)) {

case ID_FILE_MENU1:

MessageBox(hWnd, TEXT("첫 번째 메뉴를 선택했습니다."),

TEXT("MenuDemo"), MB_OK);

break;

}

}

}

위의 내용 추가

 

resource.h파일 안에는 메뉴 항목의 ID가 정의되어 있음

/{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Menu.rc
//
#define ID_FILE_MENU1                   40002
#define ID_FILE_MENU2                   40003
#define ID_FILE_EXIT                    40004

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40005
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

이 ID를 보고 어떠한 행동을 취하게 됨

 

메뉴를 누를 시 WM_COMMAND메세지 발생

LOWORD(wParam)를 이용하여 어떤 메뉴 항목이 선택되었는지 확인

 

아이콘, 커서

1. 리소스 추가 대화상자를 이용해서 아이콘, 커서 추가

 

2. 아래 소스를 추가

WndClass.hCursor=LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));

//hInstance(핸들), 즉 자기 자신이 정의하고 있는 IDC_CURSOR1 커서를 읽어옴
WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));

//hInstance(핸들), 즉 자기 자신이 정의하고 있는 IDI_ICON1 아이콘을 읽어옴

 

#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))

정수 타입의 리소스 ID를 문자열 포인터형으로 캐스팅

 

액셀러레이터(accelerator)

단축키 : 메뉴 이름에 &을 넣어 Alt키와 함께 사용하는 키, 반드시 Alt키와 함께 사용해야 하며 메뉴에 있는 항목을 키보드로 선택하는 빠른 방법

액셀러레이터 : 메뉴와 상관없이 언제든지 사용할 수 있음

 

1. caption속성 설정

caption속성

Menu&1\tCtrl+A

Menu&2\tCtrl+B

&Exit\tCtrl+C

 

2.액셀러레이터 생성

ID : 액셀러레이터가 실행되었을 때 WM_COMMAND메세지와 함께 해당되는 ID가 전달되어 WndProc()함수에서 ID에 맞게 처리하게 됨

 

3. 소스 추가

HACCEL hAccel;

 

hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));

//hInstance(핸들), 즉 자기 자신이 정의하고 있는 IDR_ACCELERATOR1 액셀러레이터를 읽어옴

 

while(GetMessage(&Message, NULL, 0, 0)) {

if(!TranslateAccelerator(hWnd, hAccel, &Message)) {

TranslateMessage(&Message);

DispatchMessage(&Message);

}

}

HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName);

리소스로부터 액셀러레이터 테이블을 읽어들임

IDR_ACCELERATOR1은 정수 값이므로  MAKEINTRESOURCE()함수를 이용하여 문자열포인터로 형 변환

 

int TranslateAccelerator(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg);

키보드 메세지를 WM_COMMAND메세지로 변경하여 액셀러레이터가 동작하도록 함

lpMsg의 키보드 입력값을 읽어 이 키값이 hAccTable에 있는지 먼저 살펴보고 있을 경우 그 키에 해당하는 WM_COMMAND메세지를 hWnd윈도우로 전달하고 TRUE를 리턴, 실패시는 false 리턴

 

TranslateAccelerator()함수를 if절 안에 넣어 엑셀러레이터가 입력되었을 경우 TranslateMessage()함수, DispatchMessage()함수가 실행되지 못하도록 함

 

 

문자열 테이블

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

1번째 인수 : 문자열 리소스를 가진 인스턴스 핸들

2번째 인수 : 읽어올 문자열의 ID를 줌

3번째 인수 : 문자열을 읽을 버퍼 지정

4번째 인수 : 버퍼의 길이

 

문자열 리소스를 사용하는 이유

1. 문자열 자체가 코드와 분리됨으로써 문자열만 따로 관리할 수 있으며 프로젝트를 유지하는 데 큰 도움을 준다

2. 다국어 버전을 쉽게 만들 수 있음

3. 문자열을 고쳐도 소스를 다시 컴파일할 필요가 없어 개발속도도 빨라짐

반응형