我自己新建的一个MFC单稳当的工程,在vc6.0++环境中是没有任何问题的,可以正确编译运行。但是在VS2008下就会报错。错误如下:
1>.\ImageTestDoc.cpp(20) : error C2440: “static_cast”: 无法从“BOOL (__thiscall CImageTestDoc::* )(LPCTSTR)”转换为“AFX_PMSG”
1> 从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast
在头文件中,函数的声明如下:
afx_msg BOOL OnOpenImageFile(LPCTSTR lpszPathName);
然后,消息函数的映射为:
BEGIN_MESSAGE_MAP(CImageTestDoc, CDocument)
ON_COMMAND(ID_FILE_OPEN, &CImageTestDoc::OnOpenImageFile)
END_MESSAGE_MAP()
最后,在函数实现上是这样的:
BOOL CImageTestDoc::OnOpenImageFile(LPCTSTR lpszPathName)
{
.......
}
关键就是函数返回值的问题,如果是void类型的好像就没有问题。因为这是一个单稳当的MFC,我只是想给文件->打开的菜单添加一个事件,但是利用VS2008的添加事件的默认好像是void的类型的,我就改成了BOOL值了,因为我想如果打开一个文件成功就返回true,否则返回false。可是现在就不能通过编译。请高手指点一下。
1>.\ImageTestDoc.cpp(20) : error C2440: “static_cast”: 无法从“BOOL (__thiscall CImageTestDoc::* )(LPCTSTR)”转换为“AFX_PMSG”
1> 从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast
在头文件中,函数的声明如下:
afx_msg BOOL OnOpenImageFile(LPCTSTR lpszPathName);
然后,消息函数的映射为:
BEGIN_MESSAGE_MAP(CImageTestDoc, CDocument)
ON_COMMAND(ID_FILE_OPEN, &CImageTestDoc::OnOpenImageFile)
END_MESSAGE_MAP()
最后,在函数实现上是这样的:
BOOL CImageTestDoc::OnOpenImageFile(LPCTSTR lpszPathName)
{
.......
}
关键就是函数返回值的问题,如果是void类型的好像就没有问题。因为这是一个单稳当的MFC,我只是想给文件->打开的菜单添加一个事件,但是利用VS2008的添加事件的默认好像是void的类型的,我就改成了BOOL值了,因为我想如果打开一个文件成功就返回true,否则返回false。可是现在就不能通过编译。请高手指点一下。
解决方案 »
- 急求大家帮忙webbrowser怎么选择网页中的select元素并触发change事件,分不够再加
- 帮忙改个软件。
- OnCreateClient 本来想拆分对话框窗口的,可是OnCreateClient这个程序不执行这个函数啊。
- 取得Combo box 中的值?
- 上传文件问题
- 哪有Visual C++技术内幕(第四版)的配套光盘?
- 解析发送到本机的数据包的问题(在线等待)
- 我想将一个类的成员函数,赋值一个函数指针,怎么编译不通过。请教
- msado15.tlh(403) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
- 帮忙鼓励一下啊呵呵
- 请教高手,关于窗口刷新问题
- RIA来临,C++程序员如何调整?
查看MFC关于ON_COMMAND定义
#define ON_COMMAND(id, memberFxn) \
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn }
//由上面语句可知命令消息响应函数必须为AFX_PMSG类型的,而AFX_PMSG类型的函数定义如下
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
这和你是否使用vc2008无关
LRESULT Cxxxxx::OnNcHitTest(CPoint point)
这个函数的返回类型原来好像是ULONG,改成LRESULT就好了。
Try it。试试才知道。