laoma634980838

导航

C++ 无法从void 转换为 LRESULT

C++ 无法从void 转换为 LRESULT

  问:

  “static_cast”: 无法从“void (__thiscall CGraspBmpDlg::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”

  这行出问题ON_MESSAGE(WM_HOTKEY,OnHotKey)

  我都没看懂……

  答:

  你这个应该是一个MFC程序,ON_MESSAGE是添加消息响应函数,这句话就是添加热键WM_HOTKEY的响应函数。当你注册了热键之后,当用户按下热键,会执行OnHotKey函数来处理这个消息。错误就应该是OnHotKey这个函数的声明错误了,返回值应该是LRESULT.

  VS2008对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2008下编译不通过

  ON_MESSAGE(WM_message,OnMyMessage);

  OnMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMessage(WPARAM, LPARAM);

  如果不符合,则有错误提示:error C2440: “static_cast”:无法从“void (__thiscall CMainFrame::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”

解决方法如下:

例如:TransparentWnd.cpp中ON_MESSAGE(WM_LIBEN,OnLiben):

第一:把原来的消息函数返回值类型改为LRESULT(找到OnLiben定义,如Viod   CTransparentWnd::OnLiben(WPARAM wParam,LPARAM lParam)改成LRESULT CTransparentWnd::OnLiben(WPARAM wParam,LPARAM lParam),声明处也要改,如afx_msg LRESULT OnLiben(WPARAM wParam,LPARAM lParam););

第二:函数内可以随便写个return TRUE;

第三:然后消息函数的参数必须改写成(WPARAM wParam,LPARAM lParam)而不论这两个参数是否用得到;

第四:消息映射如ON_MESSAGE(WM_message,& OnMyMessage)。

参考文献:

http://www.bjtarena.com/danapeixunjishu/C__peixun/180.html

http://hi.baidu.com/mike_youyou/item/c685c11212bf998a99ce33a7

posted on 2012-11-30 10:03  马聪  阅读(479)  评论(0编辑  收藏  举报