mfc事件消息
2013-08-24 10:45
211 查看
事件驱动程序
Windows操作系统是一个多任务操作系统,它可以同时运行多个程序,而且每一个程序都不可能独占系统资源。如用户可以一边处理Word,一边听MP3,只要机器的配置不是太低,用户绝对不会感觉到音乐是时断时续的。
多任务工作方式主要是通过事件驱动编程模式来完成的。事件驱动程序以窗口为中心,根据用户的不同操作激活处理相应函数以完成相应的任务。事件驱动是一种全新的程序设计方法,它不是由事件顺序来控制的,而是由事件的发生来控制的,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的用户用各种合理的顺序来安排程序的流程。
因此,可以总结出这样一条结论:Windows程序是面向用户的基于消息的事件驱动程序,而Windows应用程序的核心就是消息传递和消息处理。
消息概述
事件驱动是围绕着消息的产生与处理而展开的,消息是关于发生的事件的信息,而事件驱动是靠消息循环机制来实现的。
什么是消息呢?简单的说,消息是报告有关事件发生的通知。在Windows系统中,消息是一种Windows数据结构,其中包含有消息的名字、消息发生时的一些参数以及处理这个消息的函数的指针。
消息不仅可由Windows发出,也可由应用程序本身或其他程序产生,应用程序的消息还可以是自己定义的。Windows为每个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列,称为消息队列。当某种事件发生时,Windows会根据事件发生的具体情况判断当前事件属于哪个程序,进而将对应的消息放入该程序的消息队列。应用程序轮流检测消息队列中的消息,但并不是每个消息都会由应用程序检测的,有些消息会让默认的窗口函数处理。
图1简单描述了这个过程。
图1 消息队列和在应用程序中的轮流处理
在Windows中提供了MSG结构来表示一个消息,MSG结构的定义如下:
typedef struct tagMSG{
HWND hWnd; //目标窗口句柄
UINT message; //消息标识
WPARAM wParam; //消息参数1
LPARAM lParam; //消息参数2
DWORD time; //消息发送时间
POINT pt; //消息发送时鼠标在屏幕上的坐标
}MSG;
举个例子,例如现在需要关闭对话框窗口,读者可以向窗口发送一个WM_COMMAND消息,消息的参数是WM_DESTROY。或者向窗口发送一个WM_SYSCOMMAND消息,消息的参数是WC_CLOSE。
对话框(CDialog)类中提供虚函数PreTranslateMessage(),用这个函数可以截获或处理消息:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::PreTranslateMessage(pMsg);
}
除了使用PreTranslateMessage()虚函数,读者还可以使用API函数发送消息,笔者常使用SendMessage()函数,它的格式如下:
SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
当用户单击按钮时,关闭标题为“消息实例”的窗口。
void CMyDlg::OnButton1()
{
CWnd* wnd=this->FindWindow(NULL,"消息实例"); //找到标题为"消息实例"的窗口
::SendMessage(wnd->GetSafeHwnd(),WM_SYSCOMMAND,SC_CLOSE,0);
}
Windows操作系统是一个多任务操作系统,它可以同时运行多个程序,而且每一个程序都不可能独占系统资源。如用户可以一边处理Word,一边听MP3,只要机器的配置不是太低,用户绝对不会感觉到音乐是时断时续的。
多任务工作方式主要是通过事件驱动编程模式来完成的。事件驱动程序以窗口为中心,根据用户的不同操作激活处理相应函数以完成相应的任务。事件驱动是一种全新的程序设计方法,它不是由事件顺序来控制的,而是由事件的发生来控制的,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的用户用各种合理的顺序来安排程序的流程。
因此,可以总结出这样一条结论:Windows程序是面向用户的基于消息的事件驱动程序,而Windows应用程序的核心就是消息传递和消息处理。
消息概述
事件驱动是围绕着消息的产生与处理而展开的,消息是关于发生的事件的信息,而事件驱动是靠消息循环机制来实现的。
什么是消息呢?简单的说,消息是报告有关事件发生的通知。在Windows系统中,消息是一种Windows数据结构,其中包含有消息的名字、消息发生时的一些参数以及处理这个消息的函数的指针。
消息不仅可由Windows发出,也可由应用程序本身或其他程序产生,应用程序的消息还可以是自己定义的。Windows为每个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列,称为消息队列。当某种事件发生时,Windows会根据事件发生的具体情况判断当前事件属于哪个程序,进而将对应的消息放入该程序的消息队列。应用程序轮流检测消息队列中的消息,但并不是每个消息都会由应用程序检测的,有些消息会让默认的窗口函数处理。
图1简单描述了这个过程。
图1 消息队列和在应用程序中的轮流处理
在Windows中提供了MSG结构来表示一个消息,MSG结构的定义如下:
typedef struct tagMSG{
HWND hWnd; //目标窗口句柄
UINT message; //消息标识
WPARAM wParam; //消息参数1
LPARAM lParam; //消息参数2
DWORD time; //消息发送时间
POINT pt; //消息发送时鼠标在屏幕上的坐标
}MSG;
举个例子,例如现在需要关闭对话框窗口,读者可以向窗口发送一个WM_COMMAND消息,消息的参数是WM_DESTROY。或者向窗口发送一个WM_SYSCOMMAND消息,消息的参数是WC_CLOSE。
对话框(CDialog)类中提供虚函数PreTranslateMessage(),用这个函数可以截获或处理消息:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::PreTranslateMessage(pMsg);
}
除了使用PreTranslateMessage()虚函数,读者还可以使用API函数发送消息,笔者常使用SendMessage()函数,它的格式如下:
SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
当用户单击按钮时,关闭标题为“消息实例”的窗口。
void CMyDlg::OnButton1()
{
CWnd* wnd=this->FindWindow(NULL,"消息实例"); //找到标题为"消息实例"的窗口
::SendMessage(wnd->GetSafeHwnd(),WM_SYSCOMMAND,SC_CLOSE,0);
}
相关文章推荐
- VS2005 C++ MFC 怎样添加事件、映射消息和重载函数
- 在MFC中如何自定义消息及相应事件(VC6.0及VS2005)
- MFC为控件添加消息响应函数(事件)
- MFC基于消息,使用事件驱动(Message Based,Event Driven)机制
- VC的MFC的CWnd子类不能看到消息映射属性无法通过VC界面添加事件
- [MFC入门一]基于消息,事件驱动(Message Based,Event Driven)
- 实例学MFC(2)--线程间的通信之消息与事件
- MFC 通过发送消息完成按钮操作模拟鼠标单击事件的发生的问题
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
- MFC 发送消息模拟按钮按下事件
- MFC事件与消息
- Reversing MFC App Modified(通用 查找MFC消息事件
- 使用MFC 发送消息模拟按钮按下事件
- 在MFC中如何自定义消息及相应事件(VC6.0及VS2005)
- VS2013MFC单文档工程学习笔记六 - 窗口的常用消息事件
- VS2005 C++ MFC 怎样添加事件、映射消息和重载函数
- 发一篇关于MFC查找按钮事件(映射消息)的文章,初级
- MFC 判断是否从控件本身触发的事件消息
- 使用MFC 发送消息模拟按钮按下事件
- 模拟MFC命令消息机制的事件机制