본문 바로가기

카테고리 없음

[MFC] OnDraw vs OnPaint 차이점.

● OnDraw함수와 OnPaint함수의 차이점

 

인터넷을 찾아보면 주로 그 차이점을 이렇게 표현하고 있습니다.

OnPaint화면출력을 위한 함수이고 OnDraw화면출력뿐 아니라 프린터 출력에도 관여되는 함수이다 .

라는 내용입니다. 이내용이 틀린 것은 아닙니다. 하지만 뭔가 궁금해서

공부를 하고 싶은 수강생들에게는 그외에도 알고 싶은 것이 있을 것입니다.

 

수강생들이 원하는 것은 같은 화면에 출력하는 함수가 2개가 존재한다면 OnPanit의 코드도 수행하고 OnDraw의 코드도 수행되는가 하는 것입니다. 아니면 어떤 것은 되고 어떤 것은 수행이 되지 않는가 또는 어떤 것을 더우선적으로 수행해 주는가 하는 것이 궁금한 것입니다.






우선 OnDraw함수에도 코드를 넣고 OnPaint함수도 메시지함수를 만들어서 코드를 넣어보세요.

 



 

 

실행하여 결과를 확인해 보세요.

 

  

 


 

 

위와 같이 OnPaint 함수만 수행됩니다.

왜 OnDraw함수는 수행하지 않는 건가요?

그 단서는 OnPaint 함수의 주석처리된 문장을 유심히 보면 실마리를 찾을 수 있을 것 같네요.

 

// Do not call CView::OnPaint() for painting messages

 

우리가 만들어 놓은 페인트 메시지(WM_PAINT) 함수 때문에 CPaintView의 아버지 클래스인 CView의 OnPaint함수를 호출하지 않는다는 내용입니다.

이 문장이 왜 단서가 될까요?

 

네~, 사실 우리가 그동안 계속 아무런 감각없이 보아왔던 OnDraw 함수는 아버지 클래스인

CView의 OnPaint 함수가 호출해 주는 것이었거든요. 그러니 아버지의 OnPaint 함수가 호출되지 않으니 OnDraw 함수는 수행되지 않는 것입니다. 어찌 보면 그런 조치는 당연한 것일 것입니다. 화면에 출력하는 함수가 두 개가 존재한다면 오히려 혼동을 가져오기 때문이겠지요.

 

그런데도 불구하고 나는 악착같이 OnDraw함수를 수행시키고 싶다면 할 수는 있습니다.

현재의 OnPaint 함수안에서 아버지의 OnPaint함수를 호출하면 되는 것이지요.

 



 

실행해 보세요. 결과에 어떤 변동이 있나요?

네~, 아무런 변동이 없지요. 그렇다고 해서 OnDraw 함수를 수행하지 않은 것은 아닙니다. 수행은 되었지만 뭔가가 미흡하여 결과에 반영되지 않은 것입니다.

 


그것이 무슨 말인가요? 좀더 풀어서 얘기해 주세요~

네~ 아까도 언급한 것처럼 이와 같이 Paint 메시지 함수를 만들때는 OnDraw라는 함수를 사용하지 않을 것이라는 것을 시스템이 알고 OnDraw 함수의 인수(pDC)에 포인터를 자동으로 전달하던일을 해 주지 않는다는 것입니다.

 

그렇다고 DC의 포인터값을 꼭 자동으로 넣어줄 때까지만 기다리고 있을 필요는 없지요.

진정으로 DC의 포인터가 필요하면 함수를 직접써서 우리가 넣어주면 되죠. 다음과 같이 말입니다.

 




[출처] VC++ 2008독학으로 (홍춘택)|작성자 웅이