高版本VC编译低版本VC源码关于ON_WM_NCHITTEST报错的原因和解决方法

利用WM_NCHITTEST消息可以实现无标题窗口的拖动。使用低版本(VS2005以下)的VC编写的C++工程代码,改用高版本(VC2005以上)如VC2005\VC2008\VC2010等,编译时输出报错:

null

error C2440: ‘static_cast’ : cannot convert from ‘UINT (__thiscall CMenuBar::* )(CPoint)’ to ‘LRESULT (__thiscall CWnd::* )(CPoint)’ Cast from base to derived requires dynamic_cast or static_cast

问题分析

该报错信息一般定位到代码行的如下部分第三行ON_WM_NCHITTEST()

BEGIN_MESSAGE_MAP(CFloatWnd, CDialog)
//{{AFX_MSG_MAP(CFloatWnd)
ON_WM_NCHITTEST()
//…
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

在VS2005以后的版本中,微软将OnNcHitTest的返回类型设为LRESULT,而在VS2005之前的返回类型为UINT。

MFC宏ON_WM_NCHITTEST不能编译通过的解决办法

可通过如下方法解决在高版本VS中的问题

#if _MSC_VER >= 1400
afx_msg LRESULT OnNcHitTest(CPoint point);
#else
afx_msg UINT OnNcHitTest(CPoint point);
#endif

或者直接修改返回类型,把

afx_msg UINT OnNcHitTest(CPoint point);

改成

afx_msg LRESULT OnNcHitTest(CPoint point);

实际案例

在网上找到一个类 里面使用了ON_WM_NCHITTEST() ,运行起来报错“static_cast”: 无法从“UINT (__thiscall CSizingControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
按照网上找的资料,查找OnNcHitTest,将下面两行:

afx_msg UINT OnNcHitTest(CPoint point);//.h
UINT CTestDlg::OnNcHitTest(CPoint point);//.cpp
改为:
afx_msg LRESULT OnNcHitTest(CPoint point);//.h
LRESULT CTestDlg::OnNcHitTest(CPoint point);//.cpp
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容