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