본문 바로가기
Software/C++&MFC

[컴파일 오답노트] error C2440 ON_WM_NCHITTEST 에러

by lovey25 2019. 1. 3.

인터넷에서 찾은 오래전에 만들어진 어떤 소스를 컴파일 하려는데 에러가 발생했습니다.

에러메시지는

error C2440: 'static_cast': 'UINT (__thiscall CACListWnd::* )(CPoint)'에서 'LRESULT (__thiscall CWnd::* )(CPoint)'(으)로 변환할 수 없습니다.
note: 기본 형식에서 파생 형식으로 캐스트하려면 dynamic_cast 또는 static_cast가 필요합니다.

앞뒤로 형이 맞지 않는다는 내용인거 같은데 뭔말인지 잘 모르겠습니다.

에러가 발생한 부분은 메시지 맵에서 "ON_WM_NCHITTEST()" 부분이었습니다.

BEGIN_MESSAGE_MAP(CACListWnd, CWnd)
	ON_WM_NCHITTEST()
END_MESSAGE_MAP()

이걸봐도 뭐가 문제인지 알수가 없어서, 구글링 했습니다. 그리고 어렵지 않게 이런 내용을 찾을 수 있었습니다.

Visual Studio 2003 이후로 NCHITTEST 선언이 변경되어 발생한 문제

출처: http://idlemage.tistory.com/entry/ONWMNCHITTEST-에러문제 [게으른 마법사의 기록보관소]

VS2003에서 "OnNcHitTest"함수의 반환형이 변경되어서 그전에 작성된 코드인경우 함수 반환값을 수정해서 사용해야 한다는 내용으로 친절히 설명을 해 주셨습니다.

저는 좀 더 자세한 내용이 보고싶어서 VS2003관련 문서를 찾아봤는데, 제 검색실력 탓인지 원문은 찾지를 못했습니다.

그러다가 이런 글을 발견했습니다.

Hi Ted,

We have changed return type of OnNcHitTest because some of return values can be negative, for example HTERROR. The correct return type is LRESULT, and as I see in June CTP, wizards already generate the correct prototype for this method. It was one of the breaking change made in VS2005 because of significant number of customers complaining about UINT being a type of a return value.

Thanks,

Nikola

VC++

Tuesday, June 28, 2005 10:28 PM

출처: https://social.msdn.microsoft.com/Forums/vstudio/en-US/bfa00ef8-2312-441a-bb3f-a419ce053db8/onwmnchittest-and-other-mfc-macros-wont-compile-in-whidbey?forum=vcgeneral

핵심은 앞에서 찾은 "게으른 마법사의 기록보관소"블로그에서 설명해주신 것과 동일했습니다. 다만 OnNcHitTest에대한 변경은 VS2003이 아니고 VS2005라고 되어 있네요. 그리고 이 글을 작성한 Nikola는 개인인지 단체인지는 잘 모르겠습니다만, 글에서 "우리는 수정을 했습니다"라고 본인이 수정의 주체임을 언급하고 있어서 VS2005가 더 신빙성이 있어 보였습니다.

물런 VS2005의 breaking change에 대해서 검색해 봤지만 이 부분을 직접적으로 언급하고 있는 문서는 찾지 못했습니다.

아무튼 이 컴파일 에러는 다음과 같이 간단히 해결할 수 있습니다.

해당 함수의 선언과 정의에서 반환값을 "UNIT"에서 "LRESULT"로만 변경해 주시면 에러가 해결됩니다.

BEFORE

afx_msg UINT OnNcHitTest(CPoint point);

AFTER

afx_msg LRESULT OnNcHitTest(CPoint point);

 

끝!

728x90

댓글0