首页 > 代码库 > 发送消息 MFC 消息映射

发送消息 MFC 消息映射

发送消息 MFC 消息映射

 (2011-07-11 17:03:49)
技术分享转载
标签: 

发送消息

 

mfc

 

消息映射

 

杂谈

 

1、在用WIN 32 API函数开发应用程序时,经常要用SendMassege函数向某些对象发送消息,以让对象实现某些功能(此时也有相应的API

函数来实现这个功能)。例如关闭窗口,可以发送WM_CLOSE消息。
SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//关闭主窗口
SendMessage(hwnd,WM_CLOSE,0,0);//关闭普通窗口
2、示例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=http://www.mamicode.com/{0}; //初始化COPYDATASTRUCT结构体对象
 data.dwData=http://www.mamicode.com/(DWORD)this->GetSafeHwnd(); //接收数据的句柄
 data.cbData=http://www.mamicode.com/msgedit.GetLength(); //数据的大小
 data.lpData=http://www.mamicode.com/msgedit.GetBuffer(msgedit.GetLength()); //数据指针
 ::SendMessage(hwnd,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&data);//发送消息
}

接收窗口:
建立MFC对话框工程,添加编辑框
为对话框添加一个WM_COPYDATA消息响应
编辑代码过后如下:

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);//返回是否成功
}
3、示例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;
}

发送消息 MFC 消息映射