發送消息 MFC 消息映射

發送消息 MFC 消息映射

  (2011-07-11 17:03:49)
標籤: 

發送消息

 

mfc

 

消息映射

 

雜談

 

一、在用WIN 32 API函數開發應用程序時,常常要用SendMassege函數向某些對象發送消息,以讓對象實現某些功能(此時也有相應的API數組

函數來實現這個功能)。例如關閉窗口,能夠發送WM_CLOSE消息。
SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//關閉主窗口
SendMessage(hwnd,WM_CLOSE,0,0);//關閉普通窗口
二、示例1--發送WM_COPYDATA消息(即WM_COPYDATA消息在兩個進程之間的傳遞)
 在作這個例子以前,咱們先了解一下,WM_COPYDATA消息對應的結構體COPYDATASTRUCT
typedef struct tagCOPYDATASTRUCT{
 DWORD dwData;//接收數據的句柄
 DWORD cbData;//數據的大小
 PVOID lpData;//數據指針
}COPYDATASTRUCT;函數


主程序端:
創建MFC對話框工程,添加編輯框和一個按鈕
在按鈕單擊事件函數中添加後:
void CMyDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 HWND  hwnd=::FindWindow(NULL,"接受窗口");//找到咱們要發送消息的窗口句柄
 if(hwnd==NULL)
 {
  AfxMessageBox("沒有找到接受窗口");
  return;
 }
 CString msgedit; //聲明咱們要發送的消息
 GetDlgItem(IDC_EDIT1)->GetWindowText(msgedit);//得到編輯框內容,賦給msgedit
 COPYDATASTRUCT data={0};  //初始化COPYDATASTRUCT結構體對象
 data.dwData=(DWORD)this->GetSafeHwnd(); //接收數據的句柄
 data.cbData=msgedit.GetLength(); //數據的大小
 data.lpData=msgedit.GetBuffer(msgedit.GetLength()); //數據指針
 ::SendMessage(hwnd,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&data);//發送消息
}this

接收窗口:
創建MFC對話框工程,添加編輯框
爲對話框添加一個WM_COPYDATA消息響應
編輯代碼事後以下:spa

BOOL CMyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
 //函數接口包括:窗口句柄和COPYDATASTRUCT結構體指針,分別對應WPARAM,LPARAM
{
 // TODO: Add your message handler code here and/or call default
 char msgdata[256];//聲明接受的消息
 DWORD size= pCopyDataStruct->cbData; //數據大小
 CopyMemory(msgdata,pCopyDataStruct->lpData,size);//經過數據指針,複製內容
 msgdata[size]='\0'; //給數組添加結束標誌
 GetDlgItem(IDC_EDIT1)->SetWindowText(msgdata);//給編輯框設置內容
 return CDialog::OnCopyData(pWnd, pCopyDataStruct);//返回是否成功
}
三、示例2--發送本身註冊的消息
本示例先經過RegisterWindowMessage函數來註冊一條消息,而後用Win32 API函數SendMessage()發送。
主程序端:
創建MFC對話框,添加一個按鈕
在對話框CPP文件預處理下加入下面代碼:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//註冊一條發送MESSAGE的本身註冊的消息
在按鈕單擊事件函數中添加後:
void CMyDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 HWND  hwnd=::FindWindow(NULL,"接受窗口");//找到咱們要發送消息的窗口句柄
 if(hwnd==NULL)
 {
  AfxMessageBox("沒有找到接受窗口");
  return;
 }
 else
  ::SendMessage(hwnd,WM_RGSMSG,1,0);//發送消息
}指針


本示例接受方,仍然是先經過RegisterWindowMessage函數來註冊一條相同的消息,而後定義消息宏,綁定處理函數
接收窗口:
創建MFC對話框工程
在對話框CPP文件預處理下加入下面代碼:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//註冊一條發送MESSAGE的本身註冊的消息
在消息宏聲明處
將消息聲明爲:
afx_msg LRESULT OnRgsmsg(WPARAM wParam,LPARAM lparam);    //聲明消息映射函數
在創建消息映射表的地方添加以下代碼:
ON_REGISTERED_MESSAGE(WM_RGSMSG,OnRgsmsg)//註冊的消息宏應放在這個位置
在CPP文件中,添加函數定義,代碼以下:
LRESULT CMyDlg::OnRgsmsg(WPARAM wParam,LPARAM lParam)
{
 AfxMessageBox("接收到消息");
 return TRUE;
}code

相關文章
相關標籤/搜索