消息处理的总结

来源:互联网 发布:淘宝飞鱼运动是正品吗 编辑:程序博客网 时间:2024/04/29 08:18
                        

                                          消息的映射

:消息的数据结构

定义一个消息结构   typedef  struct tagMSG{

                         HWND  hWnd; //窗口对象的标识符,该条消息传递到它所标示的窗口

                                                                     UNIT   message;//消息标识符,标识某个特定的消息

                                                                     WPARAM  wParam;//随同消息传递的16为参数

                              LPARAM  lParam;//随同消息传递的32为参数

                              DWORD   time;//消息产生时间

                              POINT     pt;产生消息时光标在屏幕上的坐标

                            }MSG;

                        Typedef MSG FAR *LPMSG;

:windows 对消息的处理

   对所发生的没一件事,windows将其转换成消息的形式放在一个称为消息队列的内存中,然后由windows的消息发送程序选择合适的对象,将消息发送到接收消息的对象上。

     Windows 通过一段消息循环的代码来轮询应用程序的消息队列。

     典型的消息循环形式为:

            MSGmsg;

            While (GetMessage(&msg,NULL,0,0L))

              { 

                 TranslateMessage(&msg);

                  DispatchMessage(&msg);  

              }

     函数GetMessage从应用程序消息队列中检索出一条消息,并将他存于具有MSG类型的变量中,然后交由函数TranslateMessage对消息进行翻译,然后由函数DispatchMessage将消息发送到适当的对象上。

 

三:MFC对消息的处理和发送

     MFC采用一种消息影映射制来决定如何处理特定的消息。消息映射机制拥有一组宏,用来标识消息处理函数、映射类成员函数和对应的消息等。

     afx_msg 放在函数返回类型前面,来标记它是一个消息处理函数。

     类中如果很有消息处理函数,那么还需要加上一个DECLARE_MESSAGE_MAP()宏来初始化程序执行部份所定义的消息映射。

例:class CMainFrame:CFrameWnd{

        Public :

        CMainFrame();

                    Protected:

            //{{AFX_MSG(CMainFrame)

            afx_msg int  OnCreate( CMainFrame);

            afx_msg  void OnEditCopy();

            afx_msg  void OnClose();

            //}}AFX_MSG

            DECLARE_MESSAGE_MAP()

         };

映射宏用来指定消息处理函数与消息的对应关系。

例子的消息映射宏:  

BEGIN_MESSANG_MAP(CMainFrame, CFrameWnd)

ON_WN_CREATE()//用来指定默认的成员函数OnCreateWM_CREAE相对应

ON_COMMAND( ID_EDIT_COPY,OnEditCopy)

ON_WN_CLOSE()

END_MESSAGE_MAP()

     

1ON_WN_CREATE()//用来指定默认的成员函数OnCreateWM_CREAE相对应

2ON_COMMAND(command, command_function) icommand为菜单消息或用户自定义消息,command_function,为消息处理函数。

3)自定义消息,常量WM_USER和第一个消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移量,偏移量在0~0x3FFF之间,可以利用#define直接定义自己的消息。如: #define  WM_USER1(WM_USER+0)

         #define  WM_USER2(WM_USER+1)

 

    在类中的定义  afx_msg  OnUser1(WPARAM wParam, LPARAM lParam)

     在映射宏中     ON_WM_USER1( On_User1, WM_USER1) 

四:发送                                                        

   Windows 提供了三个发送消息的函数,SendMessagePostMessageSendDlgItemMessage.

SendMessage向窗口发送消息:

      LRESULT SendMessage

          HWND  hWnd, //  消息要发送的窗口句柄

          UINT   Msg,//  要发 送的消息

          WPARAM  wParam // 消息的第一个参数

          LPARAM   lParam //  消息的第二个参数

                      );

PostMessage向窗口发送消息:              

           BOOL  PostMessage(

           HWND  hWnd, //  消息要发送的窗口句柄

          UINT   Msg,//  要发 送的消息

          WPARAM  wParam // 消息的第一个参数

          LPARAM   lParam //  消息的第二个参数

                    };

SendDlgItemMessage函数向对话框的某个控制发送消息。

           LONG  SendDlgItemMessage

                HWND  hDlg,  // 对话框句柄

                Int  nIDDlgItem,  // 对话框控件的ID

            UINT   Msg,//  要发 送的消息

           WPARAM  wParam // 消息的第一个参数

           LPARAM   lParam //  消息的第二个参数

原创粉丝点击