삽질의 현장/- 윈도우 API

#012_WIndow_API_GUI 프로그래밍에서 주의할 점

shovelman 2015. 9. 16. 16:12


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


이번 시간에는 잠시 

GUI 환경의 프로그램에서 신경써야할 사항들에 대해서 알아보려고 합니다.


GUI에는 크게 UI 부분인 View와 코드 영역인 Data가 있습니다.

이 둘은 서로 일대일로 부합해야 되며, 이를 싱크라고 합니다.


View는 사용자에게 직접 보이는 곳으로써, 

사용자의 Input을 받고 Output을 제공하는 역할을 담당하고 있습니다.

그말인 즉, Input으로 받은 데이터를 가공하는 역할을 담당하는 부분이 Data라는 것입니다.


다시 한번 강조하지만,

GUI에서는 View와 Data가 정말로 중요합니다.

따라서 데이터를 어떻게 조직하고 어떻게 UI로 나타낼지에 대해 고민하는 것이

바로 개발 공부를 하는 저와 같은 허접들의 고충이 되겠지요...


아무튼... API를 공부하며 GUI 프로그래밍에 접근할 때는 반드시!

UI와 싱크를 이루는 데이터가 존재해야하는 사실을 잊지 마시길 바랍니다.


아래의 코드를 비교해보시길 바랍니다.


1.

 


2.


첫번째 코드는 다이얼로그가 생성되어 최초로 보여질 때,

직접적으로 UI를 변경한 코드입니다.


두번째 코드는 데이터와 값을 싱크 시킨 코드입니다.


이처럼, UI에 바로 접근하는 것이 아닌, 

데이터를 변경하고 이를 Update 시키는 코드를 우리는 작성해야합니다.

그렇게 된다면, 재사용성이 뛰어나지는 효과를 볼 수 있습니다.


다시한번 기억해볼까요?

모든 GUI는 데이터를 변경하고, UI를 업데이트 시키는 방식으로 구현되어야합니다.


UI에 직접 접근이 아닌, Data 수정 후 Update!

반드시 기억합시다!


한창 API에 대해 알아보고 있으니 API의 관점에서 주의해야할 사항에 대해 알아보도록 하지요...


GUI프로그래밍 중 API에서는 GetDC 와 ReleaseDC 함수의 사용에도 신경을 써야합니다.

이 두 함수는 임시적으로 그리기 기능을 수행하고자 할 때 사용하는 함수입니다.

즉, 임시적임을 알고 있다면 무분별한 사용을 자제해야한다는 것입니다.


무효화 영역이 발생했을 경우 다시 그리기 위해 발생되는 WM_PAINT 메시지는

윈도우가 조금이나마 변경되어 무효화 영역이 발생한다면 어김없이 호출됩니다.

따라서 WM_PAINT 부분은 정말로 '그리기' 기능 부분만 구현을 해야합니다.

그렇지 않다면 굉장히 프로그램에 부담이 갈 수 있게 됩니다...


이 말을 왜 했는지에 대해서는 오늘 글의 주제인

'GUI 프로그래밍을 할 때 주의해야할 점'에 대해서 언급하기 위해서입니다.

그 말에 앞서, 

GUI를 떠나 어떠한 프로그래밍에서든지 우선적으로 해당 프로그래밍의 

프로그램 방식과 구조 및 매커니즘의 이해가 필요함을 말씀드리고 싶습니다.


프로그래밍을 하기 위해서는 완벽한 구조에 대한 이해가 필요합니다.

물론, 많은 연습을 통해 습득할 수 있겠지만...

완벽한 구조에 대해 파악할 수 있을 때 비로소 정확한 설계를 할 수 있는 준비가 되는 것입니다.

설계란, 어떤 기능을 만들고자 할 때 

목적을 정확하게 해석하고 어떻게 구현해야할지에 대해서 구상하는 작업을 말합니다.

즉, 내가 구축하고자하는 어떤 것을 위해 

어떻게 할 것인가에 대해 계획, 생각 및 결정을 하는 것을 설계라고 할 수 있다는 것입니다.

한문장으로 '만들고자 하는 제품에 대한 결정 사항들의 집합. 이라고 할 수 있겠군요...'


왜 설계에 대해 이렇게 언급을 하는 것일까요?

설계를 할 수 있다는 것은 구조와 프로세스가 익혀졌다는 것을 말하는 것이기 때문입니다.


소프트웨어 개발시에는 먼저 설계를 해야합니다.

물론, 작은 단위의 프로그램이라면 문제없이 머리속으로만 생각하고 구현할 수 있겠지만요...

현재 만들어져 있는 상황에서 내가 하고자 하는 일이 무엇인지 아는 것이 첫번째 할 일!

명확하게 알고나서 행동을 하기 위해 어떤 방식으로 처리하겠다는 것이 두번째 할 일!

그 다음 마지막으로 코드를 작성하는 것입니다.


잘못 코드를 작성하거나 생각 즉, 설계를 잘못해서 프로그램이 오작동 할 수 있습니다.

하지만, 이를 두려워하는 것이 아니라 

우리는 정확한 이해를 통해 설계를 했는지에 대해서 되돌아 볼 필요성이 있습니다.


구조를 이해하고 코드를 작성합시다... 즉, 구조를 익히고 코드를 구현해보자는 것입니다.

하하... 제가 왜 이렇게 말을 주절거리는 것일까요...


이유인 즉, WM_PAINT메시지가 발생헀을 때 처리하는 case에 

그리기 이외에 수정하는 기능을 추가했는데 제가 구현한 해당 코드가

API 프로그래밍 방식의 구조와 매커니즘이 부족한 것 같다는 판단에 이르러서 입니다.


WM_PAINT에 변경 코드가 들어가면 안되는 이유는 무수히 해당 메시지가 호출이 되기 때문입니다.

어마어마하게 메시지가 호출이 된다는 것이지요...

조금이라도 변경되면 무효화 영역이 발생하게 되어 다시 그리려고 WM_PAINT를 발생하게 됩니다...

그러니까 WM_PAINT 메시지에서 그리기 작업 외에 다른 작업을 하게 되면 무식한 것인데...

제가 그 무식한 짓을 하고 있던 것이지요!!!


설계를 틀리게 접근하여 말도 안되는 코드가 만들어 버린 것이지요..

좌절을 하는 것이 아니라 잊지 않기 위해서 이렇게 끄적거리고 있습니다.. 허허...



GUI에서는 Data와 View의 완벽한 싱크, 

또한 Data에 값이 변경됬을 때 Update를 통해 UI를 변경하도록 구현하는 핵심을 반드시 잊어서는 안됩니다.



뭐... 글이 또 산으로 갔군요... 허허...

우리 모두 막 코딩이 아닌, 정확하고 명확한 설계를 통해 아름다운 코드를 구현하기를 노력합시다...


이상 삽잡이였습니다!