본문 바로가기
코스웨어/15년 스마트컨트롤러

20151117_박서연_WinAPI(4)

by 알 수 없는 사용자 2015. 11. 17.
728x90
반응형

2015-11-17


*WinAPI(4)


#엑셀러레이터

엑셀러레이터는 쉽게 말해서 단축키와 유사하다. 엑셀러레이터는 메뉴와 상관없이 언제든지 사용할 수 있다는 점에서 단축기와는 조금 차이가 있다.


엑셀러레이터 생성하기

1. 메뉴에서 엑셀레이터를 위한 캡션 바꾸기(안해도 되긴됨)


2. 엑셀러레이터 등록


3. 소스 수정


HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName ); 

리소스로부터 액셀러레이터 테이블을 읽어들인다. 두번째 인수 lpTableName은 엑셀러레이터 테이블 이름 문자열 포인터이되 우리가 작성한 IDR_ACCELERATOR1은 정수값이므로 MAKEINTRESOURCE 매크로를 사용해야 한다. 이 함수는 리소스에서 액셀레이터 테이블을 읽은 후 그 핸들값을 리턴해 준다. 이 핸들값을 hAccel이라는 변수에 댑입해 두면 다음부터 hAccel을 통해 액셀러레이터 테이블을 읽을 수 있다.


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

이 함수는 키보드 메시지를 WM_COMMAND 메시지로 변경해 주어 액셀러레이터가 동작할 수 있도록 해 준다. 액셀러레이터 Ctrl+A가 입력되었다고 해 보자. Ctrl+A는 액셀러레이터이기 이전에 키보드로부터의 입력이므로 먼저 WM_KEYDOWN 메시지가 발생할 것이고 그대로 내버려 두면 WndProc의 WM_KEYDOWN 메시지 처리 루틴에서 먼저 이 키값을 처리해 버릴 것이다. 그래서 TranslateAccelerator 함수는 키보드 입력값을 읽어 이 키값이 지정한 액셀러레이터 테이블에 있는지를 먼저 살펴보고 있을 경우 WM_COMMAND 메시지를 발생시키고 TRUE를 리턴해 버린다. 그래서 액셀러레이터가 입력되었을 경우 TranslateMessage, DispatchMessage 함수가 실행되지 못하도록 막아 버리며 다음번의 WM_COMMAND메시지가 처리되도록 해 준다. 물론 액셀러레이터 입력이 아니면 FALSE를 리턴하여 다른 메시지들은 정상적으로 처리되도록 해 준다.


결과


#문자열 테이블

윈도우는 문자열들도 일종의 리소스로 취급한다. 대량의 문자열을 사용하는 경우 리소스에 문자열을 정의해 두고 필요 시 읽어와 사용한다.


문자열 테이블 만들기

1. 문자열 리소스 테이블 만들기


2. 소스에서 문자열 로딩


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

문자열 리소스를 읽어 들이기 위해서는 위의 함수를 사용한다. 위 함수 첫번째 인자는 문자열 리소스를 가진 인스턴스 핸들로 WinMain의 첫번째 인수로 전달된다. 두번째는 문자열이 아이디, 세번째 인수는 문자열을 읽을 버퍼, 네번째는 읽어올 길이를 주면 된다.


결과


문자열 테이블의 장점

1. 문자열 자체가 코드와 분리됨으로 문자열만 따로 관리할 수 있어 프로젝트 유지에 도움이 된다.

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

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


#스톡 오브젝트

스톡오브젝트는 윈도우즈가 기본적으로 제공해주는 GDI오브젝트를 말한다. 언제든지 사용할 수 있으면 파괴할 필요도 없다. 핸들을 얻어 사용하기만 하면 된다.


HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj );

GetStockObject함수로 얻은 핸들을 선택하기 위한 함수이다. 첫번째 인자로 DC의 핸들을, 두번째 인자로 GDI 오브젝트 핸들을 주면 된다. 리턴값으로 이전에 선택되어져 있던 핸들을 리턴해 준다.


브러시 바꿔보기

회색 브러쉬를 GetStockObject로 얻은 뒤 SelectObject로 선택을 해주면 된다. 리턴값으로 이전의 핸들을 반환하므로 OldBrush에 넣어준 뒤, 사각형을 그리고 다시 SelectObject해주면 이전 브러쉬로 되돌려 진다.


결과


펜 바꾸기


결과



#그리기 모드

윈도우즈의 디폴트 그리기 모드는 R2_COPY 모드이다. 그래서 기존의 그림이 기존 그림을 덮는다. 하지만 그리기모드는 변경할 수 있다.

int SetROP2(HDC hdc, int fnDrawMode);

int GetROP2(HDC hdc);


첫번째 인수는 그리기 모드를 변경(조사) 하고자하는 DC의 핸들이고, 두번째 인수는 그리기 모드값을 넘겨준다.


반전모드를 사용하는 예제


결과



#비트맵 리소스 


비트맵 리소스 출력하기


1. 비트맵 리소스 등록하기 - 리소스 등록에서 Import를 눌러서 기존의 비트맵을 가져온다.


2. 헤더파일 확인 - resource.h 파일을 보면 등록되어있는 비트맵파일을 볼 수 있다.


3. 소스 코딩 (비트맵 리소스를 읽어와 출력하도록 한다.)

HDC CreateCompatibleDC( HDC hdc )
인자로 화면 DC의 핸들을 주면 이 화면 DC와 동일한 특성을 가지는 DC를 메모리에 만들어 그 핸들값을 리턴해 준다.

HBITMAP LoadBitmap( HINSTANCE hInstance, LPCTSTR lpBitmapName ); 
읽어온 비트맵을 해당 DC에 그리는 역활을 하는 함수이다.

BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop ); 

DC간의 영역끼리 고속복사를 수행한다. 메모리 DC의 표면에 그려져 있는 것들을 화면 DC에 복사함으로써 화면에 출력한다.



BOOL StretchBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop );

DC간에 복사를 실행하지만 복사 후에 크기가 변경된다는 점이 다르다. 

결과


비트맵 그리기


저장한 후 자동으로 생성되는 아이디를 확인한 후 비트맵을 출력해보면 



졸라맨 이동 게임은 완성 후 올리도록 하겠습니다.

728x90