BOOL ZDrOleClient::FinishCreate( SCODE sc ) { HRESULT hResult = 0; BOOL bReturn = COleClientItem::FinishCreate( sc ); // Determine whether we have to set the ClientSite first // by passing our IOleClientSite m_lpObject->GetMiscStatus( DVASPECT_CONTENT, &m_dwMiscStatus ); if ( m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST ) { hResult = m_lpObject->SetClientSite( GetClientSite( ) ); if ( FAILED( hResult ) ) { bReturn = FALSE; } } if ( bReturn ) { if ( IsInvisibleAtRuntime() ) { DoVerb( OLEIVERB_HIDE, GetParentView() ); } else { DoVerb( OLEIVERB_SHOW, GetParentView() ); } } return( bReturn ); }
BOOL CCtrlItem::DrawBackToFront(CDC* pDC, LPCRECT prectBounds) { RECTL rclBounds; RECTL* prclBounds; DWORD dwViewStatus; if (m_lpObject == NULL || m_lpViewObject == NULL) { return FALSE; } if (IsInvisibleAtRuntime()) { // We are invisible. return FALSE; } if (IsInPlaceActive() && !m_bWindowless) { return FALSE; } // convert RECT lpBounds to RECTL rclBounds rclBounds.left = prectBounds->left; rclBounds.top = prectBounds->top; rclBounds.right = prectBounds->right; rclBounds.bottom = prectBounds->bottom; if (m_bWindowless) { prclBounds = NULL; } else { prclBounds = &rclBounds; } if (m_pViewObjectEx != NULL) { m_pViewObjectEx->GetViewStatus(&dwViewStatus); ASSERT(dwViewStatus == m_dwViewStatus); } else { ASSERT(m_dwViewStatus == 0); } if ((m_dwAspectPass2 == DVASPECT_TRANSPARENT)&&(m_dwViewStatus& VIEWSTATUS_DVASPECTTRANSPARENT)) { m_lpViewObject->Draw( DVASPECT_TRANSPARENT, -1, NULL, NULL, NULL, pDC->m_hDC, prclBounds, NULL, NULL, 0 ); } else if (m_dwAspectPass2 == DVASPECT_CONTENT) { m_lpViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, pDC->m_hDC, prclBounds, NULL, NULL, 0); } return TRUE; }
BOOL CCtrlItem::DrawFrontToBack(CDC* pDC, LPCRECT prectBounds) { HRESULT hResult; RECTL rclBounds; RECTL* prclBounds; DWORD dwViewStatus; RECTL rclClip; CRect rectClip; CSize size; if ((m_lpObject == NULL) || (m_lpViewObject == NULL)) { return FALSE; } //如果是在位激活且窗口模式退出 if (IsInPlaceActive() && !m_bWindowless) { return FALSE; } //不支持两遍绘制 if (m_pViewObjectEx == NULL) { // The control doesn't understand two-pass drawing, so just draw it on // pass 2. return FALSE ; } //不可见退出 if(IsInvisibleAtRuntime() ) { // We are invisible. return FALSE; } // convert RECT lpBounds to RECTL rclBounds rclBounds.left = prectBounds->left; rclBounds.top = prectBounds->top; rclBounds.right = prectBounds->right; rclBounds.bottom = prectBounds->bottom; if (m_bWindowless) { prclBounds = NULL; } else { prclBounds = &rclBounds; } // Assume that we won't be able to draw the first pass. m_dwAspectPass2 = DVASPECT_CONTENT; m_pViewObjectEx->GetViewStatus( &dwViewStatus ); m_dwViewStatus = dwViewStatus; ASSERT( m_dwViewStatus == dwViewStatus ); //不支持不透明性退出 if (!(m_dwViewStatus&VIEWSTATUS_DVASPECTOPAQUE)) { return FALSE; } //返回不透明区域 hResult = m_pViewObjectEx->GetRect(DVASPECT_OPAQUE, &rclClip); if (FAILED(hResult)) { return FALSE; } hResult = m_lpViewObject->Draw(DVASPECT_OPAQUE, -1, NULL, NULL, NULL, pDC->m_hDC, prclBounds, NULL, NULL, 0); if (SUCCEEDED(hResult)) { // Just draw the transparent part in pass 2. m_dwAspectPass2 = DVASPECT_TRANSPARENT; } size = CSize(rclClip.left, rclClip.top); pDC->HIMETRICtoDP(&size); rectClip.left = int(m_pCtrlObj->m_position.left+size.cx); rectClip.top = int(m_pCtrlObj->m_position.top+size.cy); size = CSize(rclClip.right, rclClip.bottom); pDC->HIMETRICtoDP(&size); rectClip.right = int(m_pCtrlObj->m_position.left+size.cx); rectClip.bottom = int(m_pCtrlObj->m_position.top+size.cy); //将此区域切掉 pDC->ExcludeClipRect(&rectClip); return TRUE; }