WinApi 정복 5장 (리소스)

2015. 4. 14. 07:08프로그래밍/ETC

728x90
728x90
1. 리소스
리소스의 분리
프로그램 - 코드와 데이터로 구성 ; 데이터는 처리 대상, 코드는 데이터 처리 수단.
비트맵, 아이콘, 메뉴, 문자열 등등 프로그램의 논리와 무관한 모든 것들이 데이터이다.

코드와 무관한 데이터들을 리소스라고 하며 메뉴, 비트맵, 엑셀레이터, 문자열, 아이콘, 커서 등이 있다.

윈도우즈 - 코드와 리소스가 분리.
도스 - 이미지, 비트맵 작업에 엄청난 시간이 들어감.

리소스의 장점
- 디자이너와 프로그래머가 분담하여 작업하기 편리하다.
- 리소스를 수정하더라도 프로그램을 일일이 다시 컴파일 하지 않아도 된다.
- 재사용성
- 이식성

2. 메뉴
리소스 작성


WM_COMMAND

프로그램 실행중에 사용자가 메뉴 항목을 선택하면 WM_COMMAND 메시지가 발생한다.

wParam의 하위 워드로 전달되므로 LOWORD(wParam)을 읽어 판단할 수 있다.

이를 switch문으로 메시지 처리를 해주면 된다.


WM_COMMAND 메시지는 엑셀레이터를 누를 때도 발생한다.

버튼, 에디트 박스 등의 컨트롤이 부모 윈도우로 통지 메시지를 보낼 때도 발생한다.


설명
lParam통지 메시지를 발생시킨 컨트롤의 윈도우 핸들
LOWORD(wParam)메뉴나 액셀러레이터, 컨트롤의 ID
HIWORD(wParam)컨트롤이 보내주는 통지 메시지, 메뉴가 선택된 경우는 0이 되며 액셀러레이터가 선택된 경우는 1이 된다.


LOWORD(wParam)을 읽어 어떤 메뉴가 선택되었는지를 판단할 수 있다.


3. 아이콘 커서



윈도우 클래스 부분에 MakeInterSource를 해주어야한다.

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


안타깝게도 마우스가 스크린샷에 출력이 되지 않았다!!


4. 엑셀러레이터

단축키이다.


리소스에서 Accelerator 부분에 들어가 편집할 수 있다.





ID - 엑셀러레이터의 ID이며 엑셀레이터를 참조할 때 사용하는 값.

Key - 사용할 키.

Modifier? 이게 보조키를 의미하는 것이라 생각한다.

설명 - Key와 함께 눌러질 조합키. Ctrl, Alt, Shift를 개별적으로 또는 여러개를 한꺼번에 선택할 수 있다.

Type - 키 값이 아스키 코드값인지 가상키 코드값인지 설정한다. 보통 가상키 코드를 많이 사용한다.


엑셀러레이터 등록하기

Win32 프로젝트를 마침으로 생성하면 자동으로 추가 되어있는 엑셀레이터 추가 코드가 있다.

만약 처음부터 만드는 프로젝트라면 이걸 직접 추가해야겠지!


1
2
3
4
5
6
7
8
9
10
11
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT5));
 
// 기본 메시지 루프입니다.
    while (GetMessage(&msg, NULL, 00))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
cs


LoadAccelerators 함수

리소스로부터 엑셀러레이터 테이블을 읽어들이는 함수. 

이 함수는 리소스에서 엑셀러레이터 테이블을 읽은 후 그 핸들값을 리턴해 준다.


TranslateAccelerator 함수

키보드 메시지를 WM_COMMAND 메시지로 변경해 주어 엑셀러레이터가 동작할 수 있도록 해 준다.

예시) Ctrl+A

Ctrl+A는 엑셀러레이터이기 이전에 키보드로부터 입력이므로 WM_KEYDOWN 메시지를 발생한다.

TranslateAccelerator 함수는 키보드 입력 값을 읽어 키 값이 엑셀러레이터 테이블에서 이를 확인한다.

테이블에 있다면? TRUE를 리턴해 Translate와 Dispatch가 실행되지 않도록 막고 

다음번의 WM_COMMAND 메시지가 처리되로고 한다.

엑셀러레이터 입력이 아니라면 FALSE를 리턴하여 다른 메시지들은 정상적으로 처리되도록 한다.


5. 문자열 테이블

사용방법은 간단하다!


등록

우선 등록을 한다.



사용

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


728x90
반응형