发送消息 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={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);//发送消息
}

接收窗口:
建立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;
}

时间: 2024-08-10 19:12:50

发送消息 MFC 消息映射的相关文章

MFC编程入门之五(MFC消息映射机制概述)

在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什么是消息?  窗口消息一般由三个部分组成:1.一个无符号整数,是消息值:2.消息附带的WPARAM类型的参数:3.消息附带的LPARAM类型的参数.其实,我们一般所说的消息是侠义上的消息值,也就是一个无符号整数,经常被定义为宏. 二.什么是消息映射机制?  MFC使用一种消息映射机制来处理消息,在应

VS2010/MFC编程入门之五(MFC消息映射机制概述)

VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html     上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容.        前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的

MFC消息映射与命令传递

题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息,却很少关注它.C++程序员有一个通病,很想写“自己”的程序,即每一行代码都想自己写出来.如果用了一些库,总希望能完全理解库里的类或函数是怎么一回事,否则就“不踏实”.对于消息,许多朋友只关心常用的几个,对其余的漠不关心.其实,Windows中有很多不常用的消息却很有用,程序员可能通过响应这些消息实现

MFC消息映射机制

1 消息循环所在的函数 CWinApp::Run 2  消息类别 <1>Windows Messages WM_XX前缀开头,但是除了WM_COMMAND消息外. <2>Control Notifications 包含来自控件或者子窗口发给父窗口的 WM_COMMAND的通知消息. <3>Command Messages 菜单,工具栏按钮,快捷键 3 消息的发送和接受 CWinApp::Run函数接受消息并且将他们分派到合适的窗口,大多数命令消息时被发送到主框架窗口.接

【转】MFC消息映射详解(整理转载)

消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息. 消息处理:在MFC中,每个专门的处理函数单独处理每个消息.消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务.可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

MFC 消息映射表和虚函数实现消息映射到底谁的效率高

深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮.    但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?    书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?    我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte.如果CCmdTarget中定义100个消

c++对MFC消息映射机制和运行时类型识别的理解

对MFC消息映射机制和运行时类型识别的理解 对MFC消息映射机制的理解 MFC中派生于Cobject的每个类都有一个消息映射表,所有MFC窗口都有一个同样的窗口过程AfxWndProc(),AfxWndProc的参数列表中有一个是窗口句柄,在AfxWndProc函数中将句柄(HWND)转换成了窗口指针(CWnd*),通过这个窗口指针就可以获得该窗口的消息映射表.对于WM_COMMAND这类特殊消息,将依据C++的虚函数多态机制来决定调用哪个类的函数. 对MFC运行时类型识别的理解 定义一个CRu

MFC消息映射机制详解

 MFC消息映射机制: 在每个能接收和处理消息的类中,定义一个消息与消息处理函数的映射表,即消息映射表.MFC有一个窗口句柄与C++对象指针的映射表,当窗口收到消息时,消息的第一个参数指明了该消息与哪个窗口句柄相关,通过映射表找到C++对象指针,然后将这个指针传递给应用程序框架窗口类的基类,基类调用WindowProc函数(在wincore.cpp文件中),这是一个虚函数,函数内部调用OnWndMsg函数,消息处理就是在这个函数内完成的,该函数也在wincore.cpp中.OnWndMsg函