zoukankan      html  css  js  c++  java
  • MFC 消息类型

    标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或从窗口发到系统。发送函数SendMessage()或者PostMessage()。除WM_COMMAND之外,所有的以WM_开头的消息。从CWnd派生的类,都可以接受到这类消息。注意:标准消息并不需要我们指定处理函数名称,是默认的对应关系。
     
    宏名称                 对应消息        消息处理函数
    ON_WM_CHAR            WM_CHAR           OnChar
    ON_WM_CLOSE         WM_CLOSE         OnClose
    ON_WM_CREATE          WM_CREATE      OnCreate
    ON_WM_DESTROY        WM_DESTROY       OnDestroy
    ON_WM_LBUTTONDO       WNWM_LBUTTONDOWN  OnLButtonDown
    ON_WM_LBUTTONUP       WM_LBUTTONUP   OnLButtonUp
    ON_WM_MOUSEMOVE        WM_MOUSEMOVE     OnMouseMove
    ON_WM_PAINTWM_PAINT  OnPaint
     
    命令消息:命令消息通常与处理用户请求有关,当用户单击一个菜单或工具栏时,命令消息就产生了。并发送到能处理该消息的类或函数(如装载文本,保存选项等)这类消息都以WM_COMMAND呈现。在MFC中,通过菜单标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息,其wParam 记录着该消息来自哪一个菜单项目。
     
    ON_COMMAND(IDM_ABOUT,    OnAbout)
    ON_COMMAND(IDM_FILENEW, OnFileNew)
    ON_COMMAND(IDM_FILEOPEN, OnFileOpen)
    ON_COMMAND(IDM_FILESAVE, OnFileSave)
     
    控件消息:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口通(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类都可以接收到这类消息。
     
    控件宏     消息处理函数
    Button      ON_BN_CLICKED(<id>,<memberFxn>)  memberFxn
    ComboBox   ON_CBN_DBLCLK(<id>,<memberFxn>)   memberFxn
    Edit        ON_EN_SETFOCUS(<id>,<memberFxn>) memberFxn
    ListBox      ON_LBN_DBLCLK(<id>,<memberFxn>)   memberFxn
     
    CWnd是CCmdTarget的派生类,在MFC的单文档程序中的CMenuApp和CMenuDoc都是属于CCmdTarget的派生类而不包含CWnd类。
     
    MFC命令消息的路由:AfxWndProc(替换了窗口过程函数)->AfxCallWndProc->WindowProc->OnWnddMsg->(如果是命令消息则调用Oncommand;如果是通告消息则调用OnNotify)->OnCmdMsg
    标准消息和非标准消息的区分:标准消息:带有控制后   后续操作;非标准消息:只是简单提示。
     
    你可以在程序的许多类别之中设计「消息映像表格」(每一个类别只能拥有一个消息映像表格,但也可以没有),接收并处理消息。只要是 CWnd 衍生类别,就可以拦下任何 Windows 消息。与窗口无关的MFC 类别(例如 CDocument 和 CWinApp)如果也想处理消息,必须衍生自 CCmdTarget,并且只可能收到 WM_COMMAND 命令消息。
     
    自定义消息:
     

    1. 在MSGDlg.h或者其他头文件中增加自定义自定义消息:#define WM_COUNT_MSG WM_USER+100  

     

    2. 在MSGDlg.h头文件中添加消息处理函数的声明  afx_msg LRESULT OnCountMsg(WPARAM,LPARAM);

     

    3. 在CMSGDlg类实现文件MSGDlg.cpp中的消息映射表中加入自定义消息映射:

    BEGIN_MESSAGE_MAP(CMSGDlg, CDialog)

         //{{AFX_MSG_MAP(CMSGDlg)

         ON_WM_PAINT()

         ON_MESSAGE(WM_COUNT_MSG,&CMSGDlg::OnCountMsg)    // OnCountMsg是自定义的消息处理函数,可以在这个函数里面进行自定义的消息处理代码

         //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

     

    4. 在需要发送消息的地方,添加下面这句话:this->SendMessage(WM_COUNT_MSG,0,0); 

     

    5.在CMSGDlg类实现文件MSGDlg.cpp中定义OnCountMsg消息响应

    //自定义消息处理函数

    LRESULT CMSGDlg::OnCountMsg(WPARAM wParam,LPARAM lParam)

    {

         this->SetDlgItemInt(IDC_EDIT,lParam);

         return 1;

    }

    SendMessage函数的API原型为:

    LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

    其中hWnd标识接收消息的窗口。

    BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

    注意SendMessage直到消息被处理完毕后才返回,而PostMessage是把一条消息投放到创建hWnd窗口的线程的消息队列中。函数不等消息被处理就立即返回。

    如果开启了记事本程序,则运行以上程序记事本关闭。

    另附PeekMessage和GetMessage的区别:

    PeekMessage   返回   TRUE   的条件是有消息,如果没有消息返回   FALSE   
    GetMessage    返回   TRUE   的条件是有消息且该消息不为   WM_QUIT  
                    返回   FALSE  的条件是有消息且该消息  为   WM_QUIT

     

     

  • 相关阅读:
    rhel5.4 x64安装apache http server2.2.27,并创建自动启服务
    解决BEA-000438 Unable to load performance pack.
    为aix系统挂载iso镜像-命令
    IBM小型机创建RAID
    linux下使用parted工具划分大于2T的分区
    linux下的SElinux
    日立HDS AMS2100存储的调试
    rhel创建yum源
    rfid安全简介
    安卓模拟器抓包
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5993798.html
Copyright © 2011-2022 走看看