zoukankan      html  css  js  c++  java
  • 如何确定桌面上任何两个窗口的ZOrder关系

    http://topic.csdn.net/t/20050612/18/4077073.html

    struct   CWndNode 
    { 
    HWND               m_hWnd; 
    CWndNode   *   m_pPrev; 
    CWndNode   *   m_pNext; 
    
    CWndNode   (HWND   hWnd)   {   m_hWnd   =   hWnd;   m_pPrev   =   m_pNext   =   NULL;   }
    }; 
    
    void   DeleteWndLine   (CWndNode   *   pNode) 
    { 
    ASSERT   (pNode   !=   NULL); 
    
    CWndNode   *   pCur   =   pNode; 
    while   (pCur-> m_pPrev) 
    pCur   =   pCur-> m_pPrev; 
    
    while   (pCur) 
    { 
    CWndNode   *   pTemp   =   pCur; 
    pCur   =   pCur-> m_pNext; 
    delete   pTemp; 
    } 
    } 

     

    BOOL CComputerOper::FindZOrder(HWND   hWndA,   HWND   hWndB) 
    { 
        ASSERT   (IsWindow(hWndA)); 
        ASSERT   (IsWindow(hWndB)); 
        ASSERT   (hWndA   !=   hWndB); 
    
        //   取两个窗口的顶级窗口 
        HWND     hTopA   =   hWndA; 
        HWND     hTopB   =   hWndB; 
        while   (GetParent(hTopA)   !=   NULL) 
            hTopA   =   GetParent(hTopA); 
        while   (GetParent(hTopB)   !=   NULL) 
            hTopB   =   GetParent(hTopB); 
    
        //   第一种情况:两个窗口分别属于不同的顶级窗口 
        if   (hTopA   !=   hTopB) 
        { 
            HWND   hCur     =   GetTopWindow(NULL); 
            while   (hCur   !=   NULL) 
            { 
                if   (hTopA   ==   hCur) 
                    return   TRUE; 
                else   if   (hTopB   ==   hCur) 
                    return   FALSE; 
                hCur   =   GetWindow(hCur,   GW_HWNDNEXT); 
            } 
        } 
        //   第二种情况:两个窗口属于同一个顶级窗口 
        else 
        { 
            //   建立   父-子窗口链   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 
            CWndNode   *   pWndLineA   =   new   CWndNode(hWndA); 
            CWndNode   *   pWndLineB   =   new   CWndNode(hWndB); 
    
            HWND   hTemp   =   hWndA; 
            while   (hTemp   !=   hTopA) 
            { 
                hTemp   =   GetParent(hTemp); 
                CWndNode   *   pTempNode   =   new   CWndNode(hTemp); 
                pTempNode-> m_pNext   =   pWndLineA; 
                pWndLineA-> m_pPrev   =   pTempNode; 
                pWndLineA   =   pTempNode; 
            } 
    
            hTemp   =   hWndB; 
            while   (hTemp   !=   hTopB) 
            { 
                hTemp   =   GetParent(hTemp); 
                CWndNode   *   pTempNode   =   new   CWndNode(hTemp); 
                pTempNode-> m_pNext   =   pWndLineB; 
                pWndLineB-> m_pPrev   =   pTempNode; 
                pWndLineB   =   pTempNode; 
            } 
            //   建立   父-子窗口链   < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 
    
            //   查询同层窗口 
            while   (pWndLineA-> m_hWnd   ==   pWndLineB-> m_hWnd) 
            { 
                if   (pWndLineA-> m_pNext   ==   NULL   ||   pWndLineB-> m_pNext   ==   NULL) 
                //   此时出现特殊情况:其中一个窗口是另外一个窗口的父窗口 
                { 
                    BOOL   res; 
                    if   (pWndLineA-> m_pNext   ==   NULL)   //   A   是   B   的父窗口,即   B   在   A   的前面(子窗口总在父窗口前面) 
                    res   =   FALSE; 
                    else 
                    res   =   TRUE; 
                    DeleteWndLine   (pWndLineA); 
                    DeleteWndLine   (pWndLineB); 
                    return   res; 
                } 
                pWndLineA   =   pWndLineA-> m_pNext; 
                pWndLineB   =   pWndLineB-> m_pNext; 
            } 
    
            //   此时   pWndLineA-> m_hWnd   和   pWndLineB-> m_hWnd   位于同一层,可以比较他们的   Z   序了。 
            //   需要注意,此时   pWndLineA-> m_hWnd   不一定等于   hWndA 
            //                                 pWndLineB-> m_hWnd   不一定等于   hWndB 
            HWND   hA   =   pWndLineA-> m_hWnd; 
            HWND   hB   =   pWndLineB-> m_hWnd; 
            DeleteWndLine   (pWndLineA); 
            DeleteWndLine   (pWndLineB); 
    
            HWND   hCur     =   GetTopWindow   (GetParent(hA)); 
            while   (hCur   !=   NULL) 
            { 
                if   (hA   ==   hCur) 
                return   TRUE; 
                else   if   (hB   ==   hCur) 
                return   FALSE; 
                hCur   =   GetWindow   (hCur,   GW_HWNDNEXT); 
            } 
        } 
    
        TRACE0   ( "函数错误,FindZOrder   出现意外情况。 "); 
        ASSERT   (FALSE); 
    
        return   FALSE; 
    } 

     

  • 相关阅读:
    什么是重名问题,树型目录结构如何解决这一问题。
    什么是当前目录,什么是相对路径名。
    什么是文件路径名?
    Centos6.7安装chrome
    关于Java开发过程中质量提升-2自动化
    关于Java开发过程中质量提升-1代码格式配置
    java质量提升相关
    完成wamp安装后Mysql配置记录
    树莓派raspi2-ubuntu meta安装配置指导
    mysql数据库批量操作
  • 原文地址:https://www.cnblogs.com/carl2380/p/2648543.html
Copyright © 2011-2022 走看看