zoukankan      html  css  js  c++  java
  • WM_NOTIFY消息流程实例分析 .

    我们以CListCtrl控件为例来分析WM_NOTIFY消息。    CListCtrl控件在Report样式下会包含CHeaderCtrl标头控件,即CHeaderCtrl标头控件为CListCtrl控件的子控件,所以不难理解,拖动CHeaderCtrl标头控件的列分隔栏会投递HDN_BEGINTRACK消息(WM_NOTIFY消息,通知码为HDN_BEGINTRACK)给其父窗口CListCtrl控件。

        但是,我们在对话框窗口中也可以收到CHeaderCtrl标头控件的HDN_BEGINTRACK消息,这作何解释呢?

        如下所示:我们在对话框窗口中响应HDN_BEGINTRACK消息,当开始拖动标头控件时,弹出消息框提示。

    1. BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog)  
    2.         ......  
    3.     ON_NOTIFY(HDN_BEGINTRACK, 0, &CTestDlgDlg::OnHdnBegintrackList1)  
    4.         ......  
    5. END_MESSAGE_MAP()  
    6.   
    7. void CTestDlgDlg::OnHdnBegintrackList1(NMHDR *pNMHDR, LRESULT *pResult)  
    8. {  
    9.     LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);  
    10.     // TODO: Add your control notification handler code here   
    11.     AfxMessageBox(TEXT("CHeaderCtrl HDN_BEGINTRACK消息!"));  
    12.   
    13.     *pResult = 0;  
    14. }  
    15. </LPNMHEADER>  
    BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog)
            ......
    	ON_NOTIFY(HDN_BEGINTRACK, 0, &CTestDlgDlg::OnHdnBegintrackList1)
            ......
    END_MESSAGE_MAP()
    
    void CTestDlgDlg::OnHdnBegintrackList1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMHEADER phdr = reinterpret_cast(pNMHDR);
    	// TODO: Add your control notification handler code here
    	AfxMessageBox(TEXT("CHeaderCtrl HDN_BEGINTRACK消息!"));
    
    	*pResult = 0;
    }
    

    效果如下:

        在文章MFC消息处理流程概述中可知,CListCtrl控件窗口在接收到HDN_BEGINTRACK消息时,会调用以下代码处理:

    1. LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)    
    2. {    
    3.     // OnWndMsg does most of the work, except for DefWindowProc call     
    4.     LRESULT lResult = 0;    
    5.     if (!OnWndMsg(message, wParam, lParam, &lResult))    
    6.         lResult = DefWindowProc(message, wParam, lParam);    
    7.     return lResult;    
    8. }   
    LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
    {  
        // OnWndMsg does most of the work, except for DefWindowProc call  
        LRESULT lResult = 0;  
        if (!OnWndMsg(message, wParam, lParam, &lResult))  
            lResult = DefWindowProc(message, wParam, lParam);  
        return lResult;  
    } 
    

        很显然,HDN_BEGINTRACK消息在CListCtrl的消息映射表中没有对应的消息处理函数处理,在CHeaderCtrl的消息映射表也无对应的反射消息处理函数处理,所以,以上代码OnWndMsg(message, wParam, lParam, &lResult)会返回FALSE,所以会交由默认的消息处理函数DefWindowProc(message, wParam, lParam)处理,该函数会将该消息投递给消息对应窗口(message.hwnd)的父窗口处理,即对话框窗口(当然,对应的message.hwnd变为了对话框窗口),这样对话框窗口才有机会处理该消息而弹出消息框。

        如果在CListCtrl中处理了HDN_BEGINTRACK消息,则就不会交由对话框窗口处理。

        为此,我们增加CMyListCtrl,继承自CListCtrl,在CMyListCtrl中处理HDN_BEGINTRACK消息。

    1. BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)  
    2.     ON_NOTIFY(HDN_BEGINTRACKA, 0, &CMyListCtrl::OnHdnBegintrack)  
    3.     ON_NOTIFY(HDN_BEGINTRACKW, 0, &CMyListCtrl::OnHdnBegintrack)  
    4. END_MESSAGE_MAP()  
    5.   
    6. void CMyListCtrl::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult)  
    7. {  
    8.     LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);  
    9.     // TODO: Add your control notification handler code here   
    10.     AfxMessageBox(TEXT("CMyListCtrl处理了HDN_BEGINTRACK消息"));  
    11.   
    12.     *pResult = 0;  
    13. }  
    14. </LPNMHEADER>  
    BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    	ON_NOTIFY(HDN_BEGINTRACKA, 0, &CMyListCtrl::OnHdnBegintrack)
    	ON_NOTIFY(HDN_BEGINTRACKW, 0, &CMyListCtrl::OnHdnBegintrack)
    END_MESSAGE_MAP()
    
    void CMyListCtrl::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMHEADER phdr = reinterpret_cast(pNMHDR);
    	// TODO: Add your control notification handler code here
    	AfxMessageBox(TEXT("CMyListCtrl处理了HDN_BEGINTRACK消息"));
    
    	*pResult = 0;
    }
    

        同时将对话框中的CListCtrl m_list改为CMyListCtrl m_list。则效果如下:

    实例代码:http://download.csdn.net/detail/wangyao1052/4633804

     from:http://blog.csdn.net/wangyao1052/article/details/8057828

  • 相关阅读:
    JVM对象
    JVM如何加载Java类
    JVM内存模型
    JVM的直接内存
    docker run命令
    JVM调优-CPU占用过高
    JVM调优工具
    Java爬虫爬取京东商品信息
    Linux下设置Tomcat虚拟路径
    Java设计模式之-------->"代理模式"
  • 原文地址:https://www.cnblogs.com/lidabo/p/2804257.html
Copyright © 2011-2022 走看看