VC中如何定义消息和消息函数
遇见恒星 编辑
本教程结合一个实例来讲解。
首先要定义我们自己的消息类型的值,如下
(代码在socket_talkDlg.h中。)
#define WM_RECVDATA WM_USER+1
其次是在头文件中声明消息函数,如下
(代码在socket_talkDlg.h中。)
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnRecvData(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
其中红包部分是我们对应要声明的消息函数,这里注意,在VS2008下消息函数的返回类型都要定义为LRESULT,不然会报错。
接下来是为消息WM_RECVDATA要添加消息映射,如下:
(代码在socket_talkDlg.cpp中)
BEGIN_MESSAGE_MAP(Csocket_talkDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, &Csocket_talkDlg::OnBnClickedOk)
ON_MESSAGE(WM_RECVDATA,&OnRecvData)//处理WM_RECVDATA消息相对应的函数为OnRecvData(WPARAM wParam,LPARAM lParam)
END_MESSAGE_MAP()
红色部分是我们要定义的消息映射,其中OnRecvData是我们的消息映射函数。
注意,这里是定义在Csocket_talkDlg的类位置中,而不是CAboutDlg的类位置中
接下来是消息映射函数OnRecvData的定义实现,如下:
(代码在socket_talkDlg.cpp中)
LRESULT Csocket_talkDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
//注意要进行边界检查,防止字符太多出现溢出
char *str = (char *)lParam;
char strTemp[1060];
if (this->EditFull == FALSE)
{
GetDlgItemTextA(this->m_hWnd,IDC_EDIT1,strTemp,1060);
}
else
{
this->EditFull = FALSE;
lstrcpyA(strTemp,this->recvTemp);
delete this->recvTemp;
}
int len = lstrlenA(str);
int len2 = lstrlenA(strTemp);
int len3 = len + len2;
char *str_all = new char[len3+5];
lstrcpyA(str_all,strTemp);
lstrcatA(str_all,"/r/n");
lstrcatA(str_all,str);
if (len3 >= (1060+1050))
{
this->EditFull = TRUE;
this->recvTemp = new char[len];
lstrcpyA(this->recvTemp,str);
}
SetDlgItemTextA(this->m_hWnd,IDC_EDIT1,str_all);
return TRUE;
}
然后最后就是我们要如何来使用这个定义的消息函数了,如下:
(代码在socket_talkDlg.cpp中的DWORD WINAPI Csocket_talkDlg::RecvProc(LPVOID lparameter)函数中)
::SendMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf);//发送WM_RECVDATA的消息,交给对应的消息函数OnRecvData去处理
或者是:
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送WM_RECVDATA的消息,
这里
OnRecvData(WPARAM wParam,LPARAM lParam)
我们要用到的是消息过程中要用到的传递参数:wParam和lParam,对应我们在调用::SendMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf)中的 0 和recvBuf,我们只用了lParam参数。
那么我们在程序中每次调用::SendMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf),调用消息类型为WM_RECVDATA的消息时候,SendMessage就会把两个参数wParam和lParam(对应的就是0 和 lParam)传递给消息处理函数OnRecvData(WPARAM wParam,LPARAM lParam)去处理了。
对应的在我空间有一个资源,udp聊天程序的的实现,文中的代码就是来自我写的这个程序中