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

  • 相关阅读:
    IIS的各种身份验证详细测试
    HTTP Error 401.3 Unauthorized Error While creating IIS 7.0 web site on Windows 7
    C/S and B/S
    WCF ContractFilter mismatch at the EndpointDispatcher exception
    Configure WCF
    Inheritance VS Composition
    Unhandled Error in Silverlight Application, code 2103 when changing the namespace
    Java RMI VS TCP Socket
    Principles Of Object Oriented Design
    Socket处理发送和接收数据包,一个小实例:
  • 原文地址:https://www.cnblogs.com/lidabo/p/2804257.html
Copyright © 2011-2022 走看看