📄 ctlinplc.cpp
字号:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFXCTL_CORE2_SEG
#pragma code_seg(AFXCTL_CORE2_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
struct _AFXCTL_UIACTIVE_INFO
{
OLEMENUGROUPWIDTHS m_menuWidths;
HMENU m_hSharedMenu;
HOLEMENU m_hOleMenu;
_AFXCTL_UIACTIVE_INFO(HMENU hInPlaceMenu, LPOLEINPLACEFRAME pInPlaceFrame);
~_AFXCTL_UIACTIVE_INFO();
};
_AFXCTL_UIACTIVE_INFO::_AFXCTL_UIACTIVE_INFO(HMENU hInPlaceMenu,
LPOLEINPLACEFRAME pInPlaceFrame)
{
memset(&m_menuWidths, 0, sizeof m_menuWidths);
m_hSharedMenu = NULL;
m_hOleMenu = NULL;
if (hInPlaceMenu != NULL)
{
// Create shared menu
if ((m_hSharedMenu = ::CreateMenu()) == NULL)
return;
// Start out by getting menu from container
if (pInPlaceFrame->InsertMenus(m_hSharedMenu, &m_menuWidths) != S_OK)
{
::DestroyMenu(m_hSharedMenu);
m_hSharedMenu = NULL;
}
else
{
// Container shouldn't touch these
ASSERT(m_menuWidths.width[1] == 0);
ASSERT(m_menuWidths.width[3] == 0);
ASSERT(m_menuWidths.width[5] == 0);
// Only copy the popups if there is a menu loaded
if (hInPlaceMenu != NULL)
{
// Insert our menu popups amongst the container menus
AfxMergeMenus(m_hSharedMenu, hInPlaceMenu,
&m_menuWidths.width[0], 1);
}
}
}
// Finally create the special OLE menu descriptor
m_hOleMenu = ::OleCreateMenuDescriptor(m_hSharedMenu, &m_menuWidths);
}
_AFXCTL_UIACTIVE_INFO::~_AFXCTL_UIACTIVE_INFO()
{
if (m_hSharedMenu != NULL)
::DestroyMenu(m_hSharedMenu);
if (m_hOleMenu != NULL)
VERIFY(::OleDestroyMenuDescriptor(m_hOleMenu) == S_OK);
}
short AFXAPI _AfxShiftState();
void AFXAPI _GetClippingCoordinates(LPCRECT pPosRect, LPCRECT pClipRect,
LPRECT pIntersectRect, LPPOINT pOffsetPoint)
{
int clipLeft = 0;
int clipTop = 0;
if ((pClipRect == NULL) || IsRectEmpty(pClipRect))
{
CopyRect(pIntersectRect, pPosRect);
}
else
{
IntersectRect(pIntersectRect, pPosRect, pClipRect);
clipLeft = pClipRect->left;
clipTop = pClipRect->top;
}
pOffsetPoint->x = min(0, pPosRect->left - clipLeft);
pOffsetPoint->y = min(0, pPosRect->top - clipTop);
}
HRESULT COleControl::OnActivateInPlace(BOOL bUIActivate, LPMSG pMsg)
{
#ifdef _AFXDLL
if (m_bOpen)
{
m_pWndOpenFrame->SetActiveWindow();
SendAdvise(OBJECTCODE_SHOWWINDOW);
return S_OK;
}
#endif
// Initialize pointer to in-place site, if necessary.
if (m_pInPlaceSite == NULL)
{
if (m_pClientSite == NULL)
return E_UNEXPECTED;
if ((GetControlFlags() & windowlessActivate) &&
SUCCEEDED(m_pClientSite->QueryInterface(IID_IOleInPlaceSiteWindowless,
reinterpret_cast<void**>(&m_pInPlaceSiteWndless))))
{
m_bInPlaceSiteWndless = m_bInPlaceSiteEx = TRUE;
}
else if ((GetControlFlags() & noFlickerActivate) &&
SUCCEEDED(m_pClientSite->QueryInterface(IID_IOleInPlaceSiteEx,
reinterpret_cast<void**>(&m_pInPlaceSiteEx))))
{
m_bInPlaceSiteEx = TRUE;
}
else if (SUCCEEDED(m_pClientSite->QueryInterface(IID_IOleInPlaceSite,
reinterpret_cast<void**>(&m_pInPlaceSite))))
{
m_bInPlaceSiteEx = FALSE;
}
else
{
m_pInPlaceSite = NULL;
return E_FAIL;
}
}
ASSERT(m_pInPlaceSite != NULL);
if ((m_bInPlaceActive && !bUIActivate) || m_bUIActive)
{
CWnd* pWndOuter = GetOuterWindow();
HWND hwndParent;
if ((pWndOuter != NULL) &&
SUCCEEDED(m_pInPlaceSite->GetWindow(&hwndParent)) &&
(hwndParent == ::GetParent(pWndOuter->m_hWnd)))
{
::SetWindowPos(pWndOuter->m_hWnd, NULL, 0, 0, 0, 0,
SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
SWP_SHOWWINDOW);
OnSetObjectRects(m_rcPos, NULL);
return S_OK;
}
}
// Check if container allows windowless activation.
if (m_bInPlaceSiteWndless)
{
if (m_pInPlaceSiteWndless->CanWindowlessActivate() != S_OK)
m_bInPlaceSiteWndless = FALSE;
}
HRESULT hr = E_FAIL;
if (m_pInPlaceSite != NULL)
hr = m_pInPlaceSite->CanInPlaceActivate();
if (hr != NOERROR)
{
// Site doesn't allow in-place activation.
return OnOpen(FALSE, pMsg);
}
if (!m_bInPlaceActive)
{
if (m_bInPlaceSiteEx)
{
// flicker-free and/or windowless activation
BOOL bNoRedraw;
m_pInPlaceSiteEx->OnInPlaceActivateEx(&bNoRedraw,
m_bInPlaceSiteWndless ? ACTIVATE_WINDOWLESS : 0);
if (GetControlFlags() & noFlickerActivate)
m_bNoRedraw = bNoRedraw;
}
else
{
// old-style activation
m_pInPlaceSite->OnInPlaceActivate();
}
}
HWND hwndParent = NULL;
if (SUCCEEDED(m_pInPlaceSite->GetWindow(&hwndParent)))
{
CRect rcClip;
m_frameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
RELEASE(m_pInPlaceFrame);
RELEASE(m_pInPlaceDoc);
if (SUCCEEDED(m_pInPlaceSite->GetWindowContext(
&m_pInPlaceFrame, &m_pInPlaceDoc,
&m_rcPos, &rcClip, &m_frameInfo)))
{
ASSERT(m_pInPlaceFrame != NULL);
CRect rectClip;
if (!m_bInPlaceSiteWndless)
{
_GetClippingCoordinates(&m_rcPos, &rcClip, rectClip,
&m_ptOffset);
m_bInPlaceActive = CreateControlWindow(hwndParent, m_rcPos,
rectClip);
}
else
{
m_bInPlaceActive = TRUE;
}
if (m_bInPlaceActive)
{
if (bUIActivate)
{
if (m_bInPlaceSiteEx)
{
if (m_pInPlaceSiteEx->RequestUIActivate() != S_OK)
m_pInPlaceSite->OnUIDeactivate(FALSE);
}
BuildSharedMenu();
m_bUIActive = TRUE;
m_pInPlaceSite->OnUIActivate();
m_pInPlaceFrame->SetActiveObject(
&m_xOleInPlaceActiveObject, NULL);
if (m_pInPlaceDoc != NULL)
m_pInPlaceDoc->SetActiveObject(
&m_xOleInPlaceActiveObject, NULL);
if (m_hWnd != NULL)
{
BOOL bHandles = AmbientShowGrabHandles();
BOOL bHatching = AmbientShowHatching();
if (bHandles || bHatching)
CreateTracker(bHandles, bHatching, rcClip);
}
AddFrameLevelUI();
if (bUIActivate != -1 &&
(m_hWnd != NULL) && !IsChild(GetFocus()))
{
SetFocus();
}
}
// Pass thru the window message that caused us to be activated
if ((m_hWnd != NULL || m_bInPlaceSiteWndless) && (pMsg != NULL))
ForwardActivationMsg(pMsg);
// Send appropriate notifications...
SendAdvise(OBJECTCODE_SHOWOBJECT);
return S_OK;
}
}
}
RELEASE(m_pInPlaceFrame);
RELEASE(m_pInPlaceDoc);
return E_FAIL;
}
void COleControl::ForwardActivationMsg(LPMSG pMsg)
{
UINT uMsg = pMsg->message;
LPARAM lParam = pMsg->lParam;
if (m_bInPlaceSiteWndless)
{
// For mouse messages, convert to container window's coordinates
if ((uMsg >= WM_MOUSEFIRST) && (uMsg <= WM_MOUSELAST))
{
POINT ptNew = pMsg->pt;
HWND hWndContainer = NULL;
if (SUCCEEDED(m_pInPlaceSite->GetWindow(&hWndContainer)))
{
::ScreenToClient(hWndContainer, &ptNew);
lParam = MAKELONG((short)ptNew.x, (short)ptNew.y);
}
}
// Process message on behalf of windowless control
OnWindowlessMessage(uMsg, pMsg->wParam, lParam, NULL);
}
else
{
// For mouse messages, convert to this window's coordinates
if ((uMsg >= WM_MOUSEFIRST) && (uMsg <= WM_MOUSELAST))
{
POINT ptNew = pMsg->pt;
ScreenToClient(&ptNew);
lParam = MAKELONG((short)ptNew.x, (short)ptNew.y);
}
// Pass the message along to the control's window
SendMessage(uMsg, pMsg->wParam, lParam);
}
}
HMENU COleControl::OnGetInPlaceMenu()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -