示例#1
0
BOOL CInPlaceFrame::CanGetBorderSpace(
    LPCRECT lpRectBorder, LPOLEINPLACEUIWINDOW lpUIWindow, BOOL bFrame)
{
    ASSERT_VALID(this);
    ASSERT(lpRectBorder == NULL ||
        AfxIsValidAddress(lpRectBorder, sizeof(RECT), FALSE));
    ASSERT(lpUIWindow != NULL);

    // use IOleInPlaceUIWindow::GetBorder if no border given
    CRect rectBorder;
    if (lpRectBorder != NULL)
        rectBorder.CopyRect(lpRectBorder);
    else
        lpUIWindow->GetBorder(&rectBorder);

    // get CWnd* for the OLE window
    HWND hwnd;
    VERIFY(lpUIWindow->GetWindow(&hwnd) == NOERROR);
    CWnd* pWnd = CWnd::FromHandle(hwnd);
    ASSERT(pWnd != NULL);
  
    // see how much space we need by calling reposition bars
    CRect rectNeeded = rectBorder;
    pWnd->RepositionBars(0, 0xFFFF, 0, CWnd::reposQuery, &rectNeeded, &rectBorder);
    CRect rectRequest;

    // request the border space from the container
    rectRequest.SetRect(
        rectNeeded.left - rectBorder.left,
        rectNeeded.top - rectBorder.top,
        rectBorder.right - rectNeeded.right,
        rectBorder.bottom - rectNeeded.bottom);
    CRect rectTemp;
    rectTemp = rectRequest;

    // if no border space, just call SetBorderSpace
    if (rectRequest.IsRectNull())
        goto RequestFailed;

    if (lpUIWindow->RequestBorderSpace(&rectTemp) != NOERROR)
        goto RequestFailed;

    return TRUE;

RequestFailed:

	return FALSE;
}