VC中如何定义消息和消息函数

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聊天程序的的实现,文中的代码就是来自我写的这个程序中

 

你可能感兴趣的:(socket,winapi,delete,聊天,user)