삽질의 현장/- 윈도우 API

#007_WIndow_API_그리기 (I/O) (3)

shovelman 2015. 9. 9. 23:35


안녕하세요 삽잡이입니다.

이번시간에는 지난 시간들에 이어서 그리기에 대해서 알아보도록 하겠습니다.


우선 클라이언트의 사각 영역을 얻기 위해서는 어떻게 해야할까요?

GetClientRect 함수를 통해 얻어올 수 있게 됩니다.

해당 함수는 각기 다른 윈도우 창의 크기를 구하기 위해서 유용하게 사용할 수 있는 함수입니다.

즉, 전체 사각 영역을 그릴 수 있는 기능을 가지고 있습니다.


다음으로 마우스로 넘어가보도록 하겠습니다.

마우스를 눌렀다가 떼는 과정에서 이벤트를 발생시키기 위해서는 어떻게 해야할까요? 

WM_LBUTTONDOWN과 WM_LBUTTONUP이라는 메시지들을 발생시키면 되겠지요...


모든 마우스의 이벤트는

최상의 윈도우 즉, 마우스 포인터가 위치한 제일 위에 떠있는 윈도우가 받게 됩니다.

프레임 밖에까지 가서 마우스를 떼게 되면 

원하는 윈도우에 마우스 이벤트를 일으키지 못할 수 있는 문제가 생길 수 있습니다.

마우스 위치를 지금 내가 사용하는 어플리케이션이 받아야하는데 그러지 못하면 난감해지는 것이지요...


따라서 마우스 이벤트를 내가 사용하는 어플리케이션이 받게 하기 위해

마우스 캡쳐라는 기능이 있습니다. SetCapture(), ReleaseCapture() 요놈들이지요....

즉, 윈도우 밖에 있어도 내가 사용하는 어플리케이션에 마우스 포인터를 받으려면

해당 함수들을 사용해야한다는 것입니다.


또한 윈도우 프레임을 벗어나 마우스 이벤트를 사용하게 되면 에러 사항들이 발생하게 됩니다.

우리는 지금까지 음의 좌표를 고려해본적이 없는데,

이 고려하지 않은 문제에 의해 이상한 이벤트들이 발생할 수 있게 된다는 것입니다.


우리는 마우스 좌표를 lParam변수를 통해 확인 했었는데,

상위, 하위 각각 2바이트를 통해 얻었습니다.


각각 2바이트에 양/음의 좌표를 정확하게 얻기 위해서는

각각의 x좌표 y좌표를 표현할때 2바이트라는 표시를 반드시 해줘야합니다.


즉, 내가 원하는 값을 2바이트로 담아 뒀다가

4바이트로 변환하게 되면 숫자가 꼬일 위험이 있으니 표시를 반드시 해줘야 한다는 것입니다.


자.. 다시 초심으로 돌아가보도록 하겠습니다.

그리기를 할때에는 반드시 DC가 필요하다고 했었습니다.

DC중에서 GDI(Graphic Device Interface)라는 것이 있는데, 여기에는 5개의 GDI Object들이 있습니다.


GDI Object의 다섯 친구들을 소개해보도록 하겠습니다.

1. 펜

2. 브러쉬 (내부 색상 담당)

3. 폰트

4. 비트맵

5. 팔레트


DC에는 이 다섯가지의 친구들만 있는 것은 아니고 굉장히 많은 그리기 정보가 있습니다.

그 중 저 위의 다섯 친구들을 GDI Object라고 한다는 것이지요...


그렇다면 브러쉬를 사용할때에 대해서 생각해보록 하겠습니다.

브러쉬의 디폴트 값은 흰색입니다. 그 흰색을 몰아내고 새로운 색을 가지기 위해서는

새로운 브러쉬를 만들고 그 브러쉬를 DC에 장착하면 됩니다.

또한 이전에 있던 브러쉬를 뱉어내야 합니다.

그리기를 다 하게 된 다음은 SelectObject()를 사용하여 원래 상태로 되돌려야합니다.



다음으로 TIMER에 대해서 알아보도록 하겠습니다.

일정한 시간마다 알림 보고를 만들어야할 필요성이 있을 때,

반복적인 패턴의 동작을 수행하고자 할 때 TIMER를 사용해야 합니다.


타이머를 생성할 때에 타이머의 소유권은 윈도우가 가지고 있기에 

타이머를 사용하는 함수에는 당연히 윈도우의 핸들을 소유하고 있습니다.


SetTimer(hwnd, 100, 100, NULL);

이와 같이 타이머를 생성해주는 함수가 있습니다.


두번째 인자로는 타이머의 ID입니다.

세번째 인자는 얼마 간격으로 타이머 메시지를 발생시킬지,

네번째 인자는 호출할 프로시저를 나타내는데 기본적으로 NULL을 사용합니다.



다음으로 색상에 대해서 잠시 알아보도록 하겠습니다.

색상은 4바이트 짜리 색상으로 표현할 수 있습니다.


[  |  |  |  ]

이와 같이 4바이트가 있다고 생각해보겠습니다.

처음 1바이트는 투명도를 말하고, 

그 다음 1바이트는 파란색, 초록색, 빨간색 순서대로 표현할 수 있습니다.


숫자로 색깔을 표현하는데 불편하기 때문에 RGB라는 메크로가 만들어 있습니다.

아무튼...


다음으로, 키보드에 대해서 알아보도록 하겠습니다.

키보드에 관련된 메시지로는 크게

WM_KEYDOWN, WM_KEYUP, WM_CAHR 와 같은 메시지가 있습니다.


WM_CHAR는 문자 코드일 때만 발생하는 메시지로

일반적인 키보드 메시지 호출 순서는

WM_KEYDOWN -> WM_CHAR ->WM_KEYUP으로 되있습니다.

CHAR는 문자 코드일떄 발생함으로 문자키가 아닌 다른 키는 WM_CHAR 메시지를 발생하지 않게 됩니다.


KEYDOWN, KEYUP 메시지는 가상 키 코드라고 하여 키가 눌렸는지 띄워졌는지만 확인 가능하지만,

CHAR는 문자의 정확한 코드값을 알 수 있게 됩니다.


이 키에 관련되서 TranslateMessage 함수가 관련이 있는데,

키가 눌렸고 떨어져있는지 가상 키보드 값에서 해당 함수를 통해 변환된 가상 키 코드 값이

CHAR 메시지에 실제 문자 코드로 나오게 되는 것입니다.


두서없이 배운 내용을 막 쓰다보니

아주 아주 더럽고 저만 알아볼 수 있겠군요 ...


조만간 좋은 글로 찾아뵙스면 좋겠군요... ㅠㅠ

혼자 노는 이상 삽잡이였습니다!