Tech/Win32 API

입력 1. 키보드

2016. 11. 16. 01:03

키보드 입력시에 메시지가 WM_KEYDOWN, WM_CHAR, WM_KEYUP 순으로 발생한다


1. WM_KEYDOWN

키보드 입력시 처음으로 발생하며, 문자 이외의 키(fn, Ins, 방향키등)를 처리할 때 주로 사용한다.  

wParam으로 문자 코드가 아닌 가상 코드(키보드의 종류의 상관없이 키를 입력받기 위해 만들어진 코드 값)가 들어온다. 


2. WM_CHAR

사용자에 의해서 발생하는 메시지가 아닌 TranslateMessage() 함수에 의해서 만들어진 메시지이다.

TranslateMessage() 함수는 전달된 메시지가 WM_KEYDOWN인지와 문자 키인지 검사하여 조건을 충족하면 WM_CHAR 메시지를 만들어서 메시지 큐에 넣어준다.


- lParam : Alt와 같은 특수 키

- wParam : 문자 아스키 코드값


3. WM_KEYUP

키를 땔 때 발생하는 메시지이다.

'Tech > Win32 API' 카테고리의 다른 글

무효 영역(Invalid Region)  (0) 2016.11.15
DC(Device Context)  (0) 2016.11.13

WM_PAINT 메시지는 윈도우가 다시 그려져야 할 때마다 호출되게 됩니다. 즉 무효 영역이 있는 경우 호출되게 됩니다. 

다시 말하면 윈도우 프로시저는 클라이언트 영역의 일부가 무효화될 때만 WM_PAINT 메시지를 받습니다.

무효영역이 생기는 경우는 두 가지 입니다.


1. 윈도우 일부가 지워젔을 때(예를 들면 윈도우에 가려졌던 부분이 드러날 때)


2. InvaildateRect함수가 호출 될 때


BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);  


첫 번째 인자는 다시 그려져야할 윈도우의 핸들입니다.


두 번째 인자는 무효화의 대상이 되는 직사각형 영역입니다. 만약 두 번째 인자에 NULL을 넣는다면 클라이언트 영역 전체가 무효화되게 됩니다. NULL을 넣으면 전체를 다시 그리므로 확실히 그려지겠지만 느립니다. 따라서 속도를 높이려면 변경된 최소한의 영역만을 계산하여 무효화 하는 것이 좋습니다.


세 번째 인자는 무효화되기 전에 배경을 모두 지운 후 다시 그릴 것인지 아니면 배경을 지우지 않고 그릴 것인지를 정합니다. TRUE이면 배경을 지우고, FALSE이면 배경을 지우지 않습니다.



윈도우즈는 내부적으로 각 윈도우에 대해 '그리기 정보 구조체(paint information structure)'를 유지합니다. 이 구조체 안에 여러 정보 중에는 무효 영역을 감싸는 최소 크기의 직사각형 좌표(invalid rectangle)이 들어 있습니다. 

* 그리기 정보 구조체 == PAINTSTRUCT

* invalid rectangle == rcPaint


이 무효 직사각형이 우리가 그려야 할 영역입니다. 


만약 대기 중인 WM_PAINT 메시지를 우도우 프로시저가 처리하기 전에 또 다른 부분이 무효화된다면, 윈도우즈는 두 개의 무효 영역을 포함하는 새로운 무효 영역을 그리기 정보 구조체에 갱신합니다. 즉, 윈도우즈는 메시지 큐에 두 개 이상의 WM_PAINT 메시지를 넣지 않습니다.


클라이언트 영역의 무효 영역 전체가 유효화된다면, 메시지 큐에 현재 저장되어 있는 WM_PAINT는 제거됩니다.




'Tech > Win32 API' 카테고리의 다른 글

입력 1. 키보드  (0) 2016.11.16
DC(Device Context)  (0) 2016.11.13

Tech/Win32 API

DC(Device Context)

2016. 11. 13. 01:34

DC(Device Context)란?

출력에 필요한 모든 정보를 가지는 데이터 구조체이며, GDI(Graphic Device Interface)모듈에 의해 관리됩니다.

화면으로 출력 하기 위해서는 반드시 DC가 있어야 합니다.


이 DC를 얻는 방법은 두 가지가 있습니다.


우리는 인수로 전달 된 창(Window)의 핸들(HWND)로 부터 GetDC, BeginPaint 함수를 통해 DC를 가져올 수 있습니다.

이 때 중요한 것은 DC를 무사히 다 사용했으면 반드시 ReleaseDC, EndPaint함수를 통해 반환해야 합니다. DC도 메모리를 차지하므로 반드시 할당 후 해제 원칙이 준수되어야 합니다.


두 가지 방법에 대해 하나씩 보겠습니다.


1. GetDC 함수를 통해 얻어오는 방법


WM_PAINT 이외의 메시지에서 클라이언트 영역 일부를 그리고자 할 때 또는 그 밖의 목적으로 디바이스 컨텍스트 정보를 필요로 하는 경우 사용하는 함수입니다.


HDC GetDC(HWND hWnd);

int ReleaseDC(HWND hWnd, HDC hDC);


GetDC가 리턴하는 DC 핸들의 클리핑 직사각형 영역은 전체 클라이언트 영역입니다.

그리고, BeginPaint와 달리 GetDC는 무효 영역을 유효화하지 않습니다. 클라이언트 영역 전체를 유효화해야 한다면 다음과 같은 함수를 호출해야 합니다.

 

ValidateRect (hWnd, NULL);



2. WM_PAINT 메시지 루틴내에서 DC를 얻어오는 방법


WM_PAINT 메시지 루틴에서는 DC를 GetDC로 얻지 않고 BeginPaint함수로 얻고, EndPaint함수로 해제해 주어야 합니다.


HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);

BOOL EndPaint(HWND hWnd, CONTST PAINTSTRUCT *lpPaint);


BeginPaint함수가 호출되면 클라이언트 영역은 모두 유효화 되게 됩니다.

BeginPaint함수는 윈도우 핸들 외에도 페인트 정보 구조체를 인수로 필요로 합니다. 이 구조체는 그림 그리기에 필요한 정보를 담습니다.


typedef struct tagPAINTSTRUCT {


HDC    hdc;

BOOL   fErase;

RECT    rcPaint;

BOOL   fRestore;

BOOL   fIncUpdate;

BYTE    rgbReserved[16];

} PAINTSTRUCT;


앞의 세 멤버는 사용자가 사용하는 멤버이며 나머지 세 멤버는 윈도우즈가 내부적으로 사용하므로 사용자가 건드려서는 안됩니다.



'Tech > Win32 API' 카테고리의 다른 글

입력 1. 키보드  (0) 2016.11.16
무효 영역(Invalid Region)  (0) 2016.11.15