BOOL COleFrameHook::NotifyAllInPlace( BOOL bParam, BOOL (COleFrameHook::*pNotifyFunc)(BOOL bParam)) { ASSERT_VALID(this); HWND hWndFrame = m_hWnd; CWinApp* pApp = AfxGetApp(); // no doc manager - no templates if (pApp->m_pDocManager == NULL) return TRUE; // walk all templates in the application CDocTemplate* pTemplate; POSITION pos = pApp->m_pDocManager->GetFirstDocTemplatePosition(); while (pos != NULL) { pTemplate = pApp->m_pDocManager->GetNextDocTemplate(pos); ASSERT_VALID(pTemplate); ASSERT_KINDOF(CDocTemplate, pTemplate); // walk all documents in the template POSITION pos2 = pTemplate->GetFirstDocPosition(); while (pos2) { COleDocument* pDoc = (COleDocument*)pTemplate->GetNextDoc(pos2); ASSERT_VALID(pDoc); if (pDoc->IsKindOf(RUNTIME_CLASS(COleDocument))) { // walk all COleClientItem objects in the document COleClientItem* pItem; POSITION pos3 = pDoc->GetStartPosition(); while ((pItem = pDoc->GetNextClientItem(pos3)) != NULL) { if (pItem->m_pInPlaceFrame != NULL && pItem->m_pInPlaceFrame->m_lpActiveObject != NULL && pItem->m_pView != NULL && AfxIsDescendant(hWndFrame, pItem->m_pView->m_hWnd)) { // Whew! Found an in-place active item that is // part of this frame window hierarchy. COleFrameHook* pNotifyHook = pItem->m_pInPlaceFrame; if (!(pNotifyHook->*pNotifyFunc)(bParam)) return FALSE; } } } } } return TRUE; }
HWND CFrameWnd::SetHelpCapture(POINT point, BOOL* pbDescendant) // set or release capture, depending on where the mouse is // also assign the proper cursor to be displayed. { if (!m_bHelpMode) return NULL; HWND hWndCapture = ::GetCapture(); CWnd* pWndHit = WindowFromPoint(point); HWND hWndHit = pWndHit->GetSafeHwnd(); CWnd* pTopHit = pWndHit->GetTopLevelParent(); CWnd* pTopActive = GetActiveWindow()->GetTopLevelParent(); BOOL bDescendant = FALSE; HTASK hCurTask = (HTASK)GetCurrentThreadId(); HTASK hTaskHit = hWndHit != NULL ? ::GetWindowTask(hWndHit) : NULL; if (pTopActive == NULL || hWndHit == ::GetDesktopWindow()) { if (hWndCapture == m_hWnd) ReleaseCapture(); SetCursor(afxData.hcurArrow); } else if (pTopActive == NULL || hWndHit == NULL || hCurTask != hTaskHit || !AfxIsDescendant(m_hWnd, hWndHit)) { if (hCurTask != hTaskHit) hWndHit = NULL; if (hWndCapture == m_hWnd) ReleaseCapture(); } else { bDescendant = TRUE; if (pTopActive != pTopHit) hWndHit = NULL; else { if (hWndCapture != m_hWnd) ::SetCapture(m_hWnd); SetCursor(afxData.hcurHelp); } } if (pbDescendant != NULL) *pbDescendant = bDescendant; return hWndHit; }
// need to supply this, or else we can't instantiate the class. Derived classes should // subclass this if they need to update their gadgets using this interface void COXSizeControlBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) { UNREFERENCED_PARAMETER(pTarget); UNREFERENCED_PARAMETER(bDisableIfNoHndler); CWnd* pFocusWnd=CWnd::GetFocus(); BOOL bActive=FALSE; if(pFocusWnd!=NULL && (pFocusWnd==this || AfxIsDescendant(GetSafeHwnd(),pFocusWnd->GetSafeHwnd()))) { bActive=TRUE; } if(bActive!=IsActive()) { SetActive(bActive); } }