1. 程式人生 > >VC中如何定義訊息和訊息函式

VC中如何定義訊息和訊息函式

VC中如何定義訊息和訊息函式

遇見恆星編輯

本教程結合一個例項來講解。

首先要定義我們自己的訊息型別的值,如下

(程式碼在socket_talkDlg.h中。)

#define WM_RECVDATAWM_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聊天程式的的實現,文中的程式碼就是來自我寫的這個程式中