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; }