📄 ctlinplc.cpp
字号:
{
// Default: no in-place menu
return NULL;
}
BOOL COleControl::BuildSharedMenu()
{
// This can be called more than once on mouse clicks
if (m_pUIActiveInfo != NULL)
{
ASSERT(m_pUIActiveInfo->m_hSharedMenu != NULL);
return TRUE;
}
HMENU hMenu = m_bUIDead ? NULL : OnGetInPlaceMenu();
TRY
{
m_pUIActiveInfo = new _AFXCTL_UIACTIVE_INFO(hMenu, m_pInPlaceFrame);
}
END_TRY
return (m_pUIActiveInfo != NULL) && (m_pUIActiveInfo->m_hOleMenu != NULL);
}
void COleControl::DestroySharedMenu()
{
ASSERT(m_pUIActiveInfo != NULL);
if (m_pUIActiveInfo == NULL)
return;
HMENU hInPlaceMenu = NULL;
if ((m_pUIActiveInfo->m_hSharedMenu != NULL) &&
((hInPlaceMenu = OnGetInPlaceMenu()) != NULL))
{
// remove our menu popups from the shared menu
AfxUnmergeMenus(m_pUIActiveInfo->m_hSharedMenu, hInPlaceMenu);
// allow container to remove its items from the menu
ASSERT(m_pInPlaceFrame != NULL);
VERIFY(m_pInPlaceFrame->RemoveMenus(m_pUIActiveInfo->m_hSharedMenu) == S_OK);
}
delete m_pUIActiveInfo;
m_pUIActiveInfo = NULL;
}
void COleControl::AddFrameLevelUI()
{
ASSERT(m_pUIActiveInfo != NULL);
if (m_pUIActiveInfo == NULL)
return;
m_pInPlaceFrame->SetMenu(m_pUIActiveInfo->m_hSharedMenu,
m_pUIActiveInfo->m_hOleMenu, m_hWnd);
OnShowToolBars();
}
void COleControl::RemoveFrameLevelUI()
{
ASSERT(m_pUIActiveInfo != NULL);
if (m_pUIActiveInfo == NULL)
return;
OnHideToolBars();
// allow container to remove its items from the menu
ASSERT(m_pInPlaceFrame != NULL);
if (m_pUIActiveInfo->m_hSharedMenu != NULL)
VERIFY(m_pInPlaceFrame->RemoveMenus(m_pUIActiveInfo->m_hSharedMenu) == S_OK);
}
void COleControl::OnShowToolBars()
{
// Default sets border space to empty.
// When overriding, don't call this implementation.
m_pInPlaceFrame->SetBorderSpace(NULL);
}
void COleControl::OnHideToolBars()
{
// Default does nothing
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::XOleInPlaceObject
STDMETHODIMP_(ULONG) COleControl::XOleInPlaceObject::AddRef()
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceObject)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleControl::XOleInPlaceObject::Release()
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceObject)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP COleControl::XOleInPlaceObject::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceObject)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControl::XOleInPlaceObject::GetWindow(HWND* lphwnd)
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceObject)
*lphwnd = pThis->m_bInPlaceActive ? pThis->GetOuterWindow()->m_hWnd : NULL;
return (*lphwnd != NULL) ? S_OK : E_FAIL;
}
STDMETHODIMP COleControl::XOleInPlaceObject::ContextSensitiveHelp(BOOL)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControl::XOleInPlaceObject::InPlaceDeactivate()
{
METHOD_PROLOGUE_EX(COleControl, OleInPlaceObject)
if (!pThis->m_bInPlaceActive)
return S_OK;
pThis->m_bInPlaceActive = FALSE;
if (pThis->m_bUIActive)
UIDeactivate();
// hide the window
if (pThis->m_bInPlaceSiteEx &&
(pThis->GetControlFlags() & noFlickerActivate))
{
// flicker-free deactivation
if (! pThis->m_bInPlaceSiteWndless)
{
pThis->UpdateWindow();
pThis->OnHide();
}
pThis->m_pInPlaceSiteEx->OnInPlaceDeactivateEx(TRUE);
}
else
{
// old-style deactivation
pThis->OnHide();
pThis->m_pInPlaceSite->OnInPlaceDeactivate();
}
return S_OK;
}
STDMETHODIMP COleControl::XOleInPlaceObject::UIDeactivate()
{
METHOD_PROLOGUE_EX(COleControl, OleInPlaceObject)
pThis->m_bPendingUIActivation = FALSE;
if (!pThis->m_bUIActive)
return S_OK;
pThis->DestroyTracker();
pThis->m_bUIActive = FALSE;
if (pThis->m_pInPlaceDoc != NULL)
pThis->m_pInPlaceDoc->SetActiveObject(NULL, NULL);
pThis->m_pInPlaceFrame->SetActiveObject(NULL, NULL);
pThis->RemoveFrameLevelUI();
pThis->DestroySharedMenu();
pThis->m_pInPlaceSite->OnUIDeactivate(FALSE);
return S_OK;
}
STDMETHODIMP COleControl::XOleInPlaceObject::SetObjectRects(LPCRECT lprcPosRect,
LPCRECT lprcClipRect)
{
METHOD_PROLOGUE_EX(COleControl, OleInPlaceObject)
return pThis->OnSetObjectRects(lprcPosRect, lprcClipRect) ?
S_OK :
E_FAIL;
}
BOOL COleControl::OnSetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect)
{
ASSERT(lprcPosRect != NULL);
// Remember the position rectangle for later
m_rcPos = *lprcPosRect;
// Calculate complete rectangle including the tracker (if present)
CRect rectPos = m_rcPos;
if (m_bUIActive && m_pRectTracker != NULL)
{
// Save new clipping rectangle (for DestroyTracker)
if (lprcClipRect != NULL)
m_pRectTracker->m_rectClip = *lprcClipRect;
// Adjust tracker rectangle to new dimensions
CRect rectTmp = rectPos;
rectTmp.OffsetRect(-rectTmp.left, -rectTmp.top);
m_pRectTracker->m_rect = rectTmp;
// Adjust the "true" rectangle to include handles/hatching
UINT nHandleSize = m_pRectTracker->m_nHandleSize - 1;
rectPos.InflateRect(nHandleSize, nHandleSize);
}
// Now clip that rectangle as appropriate
CRect rectClip;
_GetClippingCoordinates(rectPos, lprcClipRect, rectClip, &m_ptOffset);
// Move outer window first. then inner window
if (!m_bInPlaceSiteWndless)
{
CWnd* pWndOuter = GetOuterWindow();
if (pWndOuter != NULL)
::MoveWindow(pWndOuter->m_hWnd, rectClip.left, rectClip.top,
rectClip.Width(), rectClip.Height(), TRUE);
if (pWndOuter != this)
MoveWindow(m_ptOffset.x, m_ptOffset.y, rectPos.Width(), rectPos.Height());
}
return TRUE;
}
STDMETHODIMP COleControl::XOleInPlaceObject::ReactivateAndUndo()
{
return E_NOTIMPL;
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::XOleInPlaceActiveObject
STDMETHODIMP_(ULONG) COleControl::XOleInPlaceActiveObject::AddRef()
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceActiveObject)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleControl::XOleInPlaceActiveObject::Release()
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceActiveObject)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceActiveObject)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::GetWindow(HWND* lphwnd)
{
METHOD_PROLOGUE_EX_(COleControl, OleInPlaceActiveObject)
return pThis->m_xOleInPlaceObject.GetWindow(lphwnd);
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::ContextSensitiveHelp(BOOL)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::TranslateAccelerator(
LPMSG lpmsg)
{
METHOD_PROLOGUE_EX(COleControl, OleInPlaceActiveObject)
// Give the control the first chance.
if (pThis->PreTranslateMessage(lpmsg))
return S_OK;
// Give the site a chance.
HRESULT hr = S_FALSE;
if (pThis->m_pControlSite != NULL)
hr = pThis->m_pControlSite->TranslateAccelerator(lpmsg,
(DWORD)_AfxShiftState());
return hr;
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::OnFrameWindowActivate(BOOL)
{
return S_OK;
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::OnDocWindowActivate(
BOOL fActivate)
{
METHOD_PROLOGUE_EX(COleControl, OleInPlaceActiveObject)
if (fActivate && pThis->m_bUIActive)
pThis->AddFrameLevelUI();
else
pThis->OnHideToolBars();
return S_OK;
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::ResizeBorder(
LPCRECT, LPOLEINPLACEUIWINDOW, BOOL)
{
return S_OK;
}
STDMETHODIMP COleControl::XOleInPlaceActiveObject::EnableModeless(BOOL)
{
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// Force any extra compiler-generated code into AFX_INIT_SEG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -