mfc事件消息

事件驱动程序

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);

}

 

你可能感兴趣的:(C++,事件,mfc,消息)