孙鑫老师的教学视频个人感觉很好,非常实用,讲的非常清晰。以下就将列出我碰到的几个问题以及解决方法~下面是报错信息:
1. error C2440: “static_cast”: 无法从“void (__thiscall CMy15ChatDlg::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”在匹配目标类型的范围内没有具有该名称的函数
2. error C2440: “初始化”: 无法从“char *”转换为“ATL::CStringT
3. error C2664: “sendto”: 不能将参数 2 从“CString”转换为“const char * ”
4. error C2664: “CWnd::SetDlgItemTextW”: 不能将参数 2 从“const char [1]”转换为“LPCTSTR”
现在来分析第1个错误:
我在头文件中定义了一个消息响应函数
afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);
/*消息响应函数原型OnRecvData的申明。因为发送消息是要传递参数,所以要带上括号里面的两个形参。如果不传递参数可以不带*/
同是建立了消息映射 :
ON_MESSAGE(WM_RECVDATA,OnRecvData)
/*消息映射。(消息本身,消息响应函数)。注意是CMy15ChatDlg的消息映射,注意添加的位置*/
我们把响应函数的返回值改成LRESULT就行了。那么,LRESULT是什么呢?是32位整形数,常常用于回调函数。回调函数在windows程序中经常使用,可以有效的避免死锁。函数类型与函数名之间有callback就是回调了,应该是内核调用,如果中间是__cdecl就是普通的函数调用。
分析第二个问题,孙鑫老师定义了一个str变量,如下:
CString str=(char*)lParam;
结果导致报出第2个错误,按照经验应该是ANSI和Unicode之间转换出了问题,按照如下修改即可解决。
LRESULT CMy15ChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam
{
CString str;
str.Format(TEXT("%s"),(char*)lParam);
...............
}
=========================================================================================
顺便说说怎么不通过向导创建函数和消息。
函数的话比较简单,在头文件中定义一个函数,然后再原文件中实现它就可以了。可以参考这篇文章里面的OnRecvData()函数。
消息的话就稍微复杂一点。
/*①定义消息WM_RECVDATA的值*/
#define WM_RECVDATA WM_USER+1
/*②消息响应函数原型OnRecvData的申明。因为发送消息是要传递参数,所以要带上括号里面的两个形参。如果不传递参数可以不带*/
afx_msg LRESULT OnRecvData(WPARAM wParam,LPARAM lParam);
/*③消息映射。在 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP() 添加消息映射,格式为:(消息本身,消息响应函数),括号后面没有任何符号。注意是CMy15ChatDlg的消息映射,不要放到其他的消息映射当中去了,比如CAboutDlg!!*/
BEGIN_MESSAGE_MAP(CMy15ChatDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_RECVDATA,OnRecvData)//在这里添加了
END_MESSAGE_MAP()
/*④消息响应函数的实现*/
LRESULT CMy15ChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
对于第3个错误,只需要修改unicode,点击项目,右键,属性,配置属性,常规,将项目默认值中的字符集设置成“未设置”。若编译后还有未知的错误,则只需将Debug目录中的文件全部清空后再重新生成就可以。
第4个问题,需一点类型转换, SetDlgItemText(IDC_EDIT_Send, (LPCTSTR) "");