2015년 8월 17일 월요일

PreTranslateMessage에서 Modal로 다이얼로그를 띄울 때 주의할 점.

PreTranslateMessage에서 모달 다이얼로그를 띄울 일이 있나 싶기도 하고, 있다고 해도 다른 방법으로 하는걸 추천한다. 메시지를 처리해야되는 곳에서 모달로 다이얼로그를 띄워서 메시지 처리가 안되는 건 어떤 문제가 발생해도 이상하지 않다고 생각한다.

원래 문제가 됐던 소스는 이런 식이였다.
A와 B는 다이얼로그이고 모달리스로 띄워져있다.
A 다이얼로그의 PreTranslateMessage에서 B 다이얼로그의 C함수를 호출한다. C함수는 다이얼로그를 모달로 띄운다.

C함수에서 띄운 다이얼로그에는 CBitmapButton으로 만든 버튼들이 많이 있다.

이 버튼들을 눌러서 창을 닫으면 GetTopLevelParent 함수에서 Assertion 에러가 발생한다.

Assertion 에러를 뱉는 핸들은 CBitmapButton 클래스의 핸들이였다.

해결방법
함수를 직접 호출하는게 아닌 WM_USER를 이용하여 PostMessage로 처리하였다.

원인이야 뭐 MS에서 무슨 이유가 있어서 못하게 막았겠지.

댓글 없음: