삽질의 현장/- 윈도우 API

#006_WIndow_API_그리기 (I/O) (2)

shovelman 2015. 9. 9. 18:40


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


지난 시간에 이어서 Input/ Output 즉... 그리기 영역에 대해서 더 살펴보도록 하겠습니다.


무효화 영역이 발생하게 된다면, WM_PAINT 메시지가 발생하게 되는데

이는 다시 그리기를 해놓지 않게 되면 모든 윈도우에 그려졌던 것들이 사라지게 됩니다.


GUI에 정말 중요한 사실중 하나는,

우리가 그리는 UI에는 항상 sync를 이루는 데이터가 있어야 한다는 것입니다.

UI는 View와 View Model로 구성되어있는데 

이 두 구성요소에는 서로 부합하는 데이터가 있어야한다는 것이죠...


예를들어서 UI에 사각형 하나를 그리기 위해서는 해당 데이터가 있어야합니다.

사각형을 두 개 그린다면 그에 맞도록 두개의 데이터가 있어야한다는 것이고요...


UI는 사용자의 Input을 받아들이고 출력하는 것뿐이지, 

데이터를 완성하는 것과 관련이 없습니다.

데이터를 만들고 WM_PAINT를 발생시켜주면 그리기가 되는 것처럼 보이게 되는 것입니다.


따라서 다시 그리게 될 때 즉, WM_PAINT가 발생하게 될때에는

기존에 보이던 데이터들을 복원이 되도록 코드를 구현해줄 필요가 있습니다.


Win32 API에서 기존 GUI는 우리가 직접 그려 복구하는 방식을 사용하고 있습니다.

GUI는 따라서 UI도 중요하지만, 더 중요한 것이 Data입니다.

데이터가 없으면 제대로 된 UI에 데이터를 포함하고 입력을 받을 수가 없어집니다.

결론적으로, 데이터 구조 설계가 가장 중요한 작업이 되겠지요...


자... 그렇다면 지난시간에 살펴본 BeginPaint와 GetDC 함수의 차이에 대해서 

이제 이해할 수 있게 되었습니다.


GetDC는 무효화 됬던 영역을 유효화 하는 코드가 없기 때문에

WM_PAINT에서 사용할 수 없는 것입니다.

WM_PAINT 메시지가 발생했다는 것은 무효화 영역이 만들어졌기 때문에 발생하게 된 것이기에

GetDC 함수의 기능은 해당 메시지에 불합격인 셈이지요...


그렇다면 BeginPaint 함수의 핵심을 살펴보도록 하겠습니다.

우선 BegintPaint 함수는 '백그라운드를 지울래!'라는 기능을 가지고 있습니다.

또한 가장 중요한 기능인데, 무효화 됬던 영역을 유효화 시키는 기능이 들어가 있습니다.

따라서 WM_PAINT 메시지에는 BeginPaint 함수를 사용해야 하는 것입니다.


한마디로 GetDC를 WM_PAINT에 계속 쓰게 되면

한번 무효화된 영역을 계속 무효화 시키게 됨으로 무한 루프가 발생할 수 있게 됩니다.


무효화 영역이 한번 발생하면 그 영역을 유효화 시키기 전까지 

계속해서 무효화 시켜져 있는 상태이기 때문에 WM_PAINT 메시지를 계속해서 발생 시키게 된다는 것입니다.


두서없이 글을 쓰고 있군요....

조만간 정리좀 해야곘습니당....


이상 삽잡이였습니다!