利用WM_NCHITTEST消息可以实现无标题窗口的拖动。使用低版本(VS2005以下)的VC编写的C++工程代码,改用高版本(VC2005以上)如VC2005\VC2008\VC2010等,编译时输出报错:
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,将下面两行:
暂无评论内容