📄 atlhostex.h
字号:
return E_FAIL;
if (m_spViewObject)
m_spViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdc, (RECTL*)&m_rcPos, (RECTL*)&m_rcPos, NULL, NULL);
CWindowImpl<CAxHostWindow>::ReleaseDC(hdc);
return S_OK;
}
STDMETHOD(OnShowWindow)(BOOL /*fShow*/)
{
ATLTRACENOTIMPL(_T("IOleClientSite::OnShowWindow"));
}
STDMETHOD(RequestNewObjectLayout)()
{
ATLTRACENOTIMPL(_T("IOleClientSite::RequestNewObjectLayout"));
}
// IOleInPlaceSite
STDMETHOD(GetWindow)(HWND* phwnd)
{
*phwnd = m_hWnd;
return S_OK;
}
STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/)
{
ATLTRACENOTIMPL(_T("IOleWindow::CanInPlaceActivate"));
}
STDMETHOD(CanInPlaceActivate)()
{
return S_OK;
}
STDMETHOD(OnInPlaceActivate)()
{
m_bInPlaceActive = TRUE;
OleLockRunning(m_spOleObject, TRUE, FALSE);
m_bWindowless = FALSE;
m_spOleObject->QueryInterface(IID_IOleInPlaceObject, (void**) &m_spInPlaceObjectWindowless);
return S_OK;
}
STDMETHOD(OnUIActivate)()
{
ATLTRACE2(atlTraceHosting, 0, _T("IOleInPlaceSite::OnUIActivate\n"));
m_bUIActive = TRUE;
return S_OK;
}
STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo)
{
HRESULT hr = S_OK;
if (ppFrame == NULL || ppDoc == NULL || lprcPosRect == NULL || lprcClipRect == NULL)
hr = E_POINTER;
ATLASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr))
{
if (!m_spInPlaceFrame)
{
CComObject<CAxFrameWindow>* pFrameWindow;
CComObject<CAxFrameWindow>::CreateInstance(&pFrameWindow);
pFrameWindow->QueryInterface(IID_IOleInPlaceFrame, (void**) &m_spInPlaceFrame);
ATLASSERT(m_spInPlaceFrame);
}
if (!m_spInPlaceUIWindow)
{
CComObject<CAxUIWindow>* pUIWindow;
CComObject<CAxUIWindow>::CreateInstance(&pUIWindow);
pUIWindow->QueryInterface(IID_IOleInPlaceUIWindow, (void**) &m_spInPlaceUIWindow);
ATLASSERT(m_spInPlaceUIWindow);
}
m_spInPlaceFrame.CopyTo(ppFrame);
m_spInPlaceUIWindow.CopyTo(ppDoc);
GetClientRect(lprcPosRect);
GetClientRect(lprcClipRect);
ACCEL ac = { 0,0,0 };
if (m_hac == NULL) // *****added*****
m_hac = CreateAcceleratorTable(&ac, 1); // *****changed*****
pFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO);
pFrameInfo->fMDIApp = m_bMDIApp;
pFrameInfo->hwndFrame = GetParent();
pFrameInfo->haccel = m_hac; // *****changed*****
pFrameInfo->cAccelEntries = 1;
}
return hr;
}
STDMETHOD(Scroll)(SIZE /*scrollExtant*/)
{
ATLTRACENOTIMPL(_T("IOleInPlaceSite::Scroll"));
}
STDMETHOD(OnUIDeactivate)(BOOL /*fUndoable*/)
{
ATLTRACE2(atlTraceHosting, 0, _T("IOleInPlaceSite::OnUIDeactivate\n"));
m_bUIActive = FALSE;
return S_OK;
}
STDMETHOD(OnInPlaceDeactivate)()
{
m_bInPlaceActive = FALSE;
m_spInPlaceObjectWindowless.Release();
return S_OK;
}
STDMETHOD(DiscardUndoState)()
{
ATLTRACENOTIMPL(_T("IOleInPlaceSite::DiscardUndoState"));
}
STDMETHOD(DeactivateAndUndo)()
{
ATLTRACENOTIMPL(_T("IOleInPlaceSite::DeactivateAndUndo"));
}
STDMETHOD(OnPosRectChange)(LPCRECT /*lprcPosRect*/)
{
ATLTRACENOTIMPL(_T("IOleInPlaceSite::OnPosRectChange"));
}
// IOleInPlaceSiteEx
STDMETHOD(OnInPlaceActivateEx)(BOOL* /*pfNoRedraw*/, DWORD dwFlags)
{
m_bInPlaceActive = TRUE;
OleLockRunning(m_spOleObject, TRUE, FALSE);
HRESULT hr = E_FAIL;
if (dwFlags & ACTIVATE_WINDOWLESS)
{
m_bWindowless = TRUE;
hr = m_spOleObject->QueryInterface(IID_IOleInPlaceObjectWindowless, (void**) &m_spInPlaceObjectWindowless);
}
if (FAILED(hr))
{
m_bWindowless = FALSE;
hr = m_spOleObject->QueryInterface(IID_IOleInPlaceObject, (void**) &m_spInPlaceObjectWindowless);
}
if (m_spInPlaceObjectWindowless)
m_spInPlaceObjectWindowless->SetObjectRects(&m_rcPos, &m_rcPos);
return S_OK;
}
STDMETHOD(OnInPlaceDeactivateEx)(BOOL /*fNoRedraw*/)
{
return S_OK;
}
STDMETHOD(RequestUIActivate)()
{
return S_OK;
}
// IOleInPlaceSiteWindowless
STDMETHOD(CanWindowlessActivate)()
{
return m_bCanWindowlessActivate ? S_OK : S_FALSE;
}
STDMETHOD(GetCapture)()
{
return m_bCapture ? S_OK : S_FALSE;
}
STDMETHOD(SetCapture)(BOOL fCapture)
{
if (fCapture)
{
CWindow::SetCapture();
m_bCapture = TRUE;
}
else
{
ReleaseCapture();
m_bCapture = FALSE;
}
return S_OK;
}
STDMETHOD(GetFocus)()
{
return S_OK;
}
STDMETHOD(SetFocus)(BOOL /*fFocus*/)
{
return S_OK;
}
STDMETHOD(GetDC)(LPCRECT /*pRect*/, DWORD /*grfFlags*/, HDC* phDC)
{
if (phDC)
return E_POINTER;
*phDC = CWindowImpl<CAxHostWindow>::GetDC();
return S_OK;
}
STDMETHOD(ReleaseDC)(HDC hDC)
{
CWindowImpl<CAxHostWindow>::ReleaseDC(hDC);
return S_OK;
}
STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase)
{
CWindowImpl<CAxHostWindow>::InvalidateRect(pRect, fErase);
return S_OK;
}
STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase)
{
CWindowImpl<CAxHostWindow>::InvalidateRgn(hRGN, fErase);
return S_OK;
}
STDMETHOD(ScrollRect)(INT /*dx*/, INT /*dy*/, LPCRECT /*pRectScroll*/, LPCRECT /*pRectClip*/)
{
return S_OK;
}
STDMETHOD(AdjustRect)(LPRECT /*prc*/)
{
return S_OK;
}
STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult)
{
*plResult = DefWindowProc(msg, wParam, lParam);
return S_OK;
}
// IOleControlSite
STDMETHOD(OnControlInfoChanged)()
{
return S_OK;
}
STDMETHOD(LockInPlaceActive)(BOOL /*fLock*/)
{
return S_OK;
}
STDMETHOD(GetExtendedControl)(IDispatch** ppDisp)
{
if (ppDisp == NULL)
return E_POINTER;
return m_spOleObject.QueryInterface(ppDisp);
}
STDMETHOD(TransformCoords)(POINTL* /*pPtlHimetric*/, POINTF* /*pPtfContainer*/, DWORD /*dwFlags*/)
{
return S_OK;
}
STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, DWORD /*grfModifiers*/)
{
return S_FALSE;
}
STDMETHOD(OnFocus)(BOOL /*fGotFocus*/)
{
return S_OK;
}
STDMETHOD(ShowPropertyFrame)()
{
return E_NOTIMPL;
}
// IAdviseSink
STDMETHOD_(void, OnDataChange)(FORMATETC* /*pFormatetc*/, STGMEDIUM* /*pStgmed*/)
{
}
STDMETHOD_(void, OnViewChange)(DWORD /*dwAspect*/, LONG /*lindex*/)
{
}
STDMETHOD_(void, OnRename)(IMoniker* /*pmk*/)
{
}
STDMETHOD_(void, OnSave)()
{
}
STDMETHOD_(void, OnClose)()
{
}
// IOleContainer
STDMETHOD(ParseDisplayName)(IBindCtx* /*pbc*/, LPOLESTR /*pszDisplayName*/, ULONG* /*pchEaten*/, IMoniker** /*ppmkOut*/)
{
return E_NOTIMPL;
}
STDMETHOD(EnumObjects)(DWORD /*grfFlags*/, IEnumUnknown** ppenum)
{
if (ppenum == NULL)
return E_POINTER;
*ppenum = NULL;
typedef CComObject<CComEnum<IEnumUnknown, &IID_IEnumUnknown, IUnknown*, _CopyInterface<IUnknown> > > enumunk;
enumunk* p = NULL;
ATLTRY(p = new enumunk);
if(p == NULL)
return E_OUTOFMEMORY;
HRESULT hRes = p->Init(reinterpret_cast<IUnknown**>(&m_spUnknown), reinterpret_cast<IUnknown**>(&m_spOleObject), GetControllingUnknown(), AtlFlagCopy);
if (SUCCEEDED(hRes))
hRes = p->QueryInterface(IID_IEnumUnknown, (void**)ppenum);
if (FAILED(hRes))
delete p;
return hRes;
}
STDMETHOD(LockContainer)(BOOL fLock)
{
m_bLocked = fLock;
return S_OK;
}
HRESULT ActivateAx(IUnknown* pUnkControl, bool bInited, IStream* pStream)
{
if (pUnkControl == NULL)
return S_OK;
m_spUnknown = pUnkControl;
HRESULT hr = S_OK;
pUnkControl->QueryInterface(IID_IOleObject, (void**)&m_spOleObject);
if (m_spOleObject)
{
m_spOleObject->GetMiscStatus(DVASPECT_CONTENT, &m_dwMiscStatus);
if(m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)
{
CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());
m_spOleObject->SetClientSite(spClientSite);
}
CComQIPtr<IPersistStreamInit, &IID_IPersistStreamInit> spPSI(m_spOleObject);
if (!bInited && spPSI)
{
if (pStream)
spPSI->Load(pStream);
else
spPSI->InitNew();
}
if(0 == (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST))
{
CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());
m_spOleObject->SetClientSite(spClientSite);
}
m_dwViewObjectType = 0;
HRESULT hr;
hr = m_spOleObject->QueryInterface(IID_IViewObjectEx, (void**) &m_spViewObject);
if (FAILED(hr))
{
hr = m_spOleObject->QueryInterface(IID_IViewObject2, (void**) &m_spViewObject);
m_dwViewObjectType = 3;
} else
m_dwViewObjectType = 7;
if (FAILED(hr))
{
hr = m_spOleObject->QueryInterface(IID_IViewObject, (void**) &m_spViewObject);
m_dwViewObjectType = 1;
}
CComQIPtr<IAdviseSink> spAdviseSink(GetControllingUnknown());
m_spOleObject->Advise(spAdviseSink, &m_dwOleObject);
if (m_dwViewObjectType)
m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, spAdviseSink);
m_spOleObject->SetHostNames(OLESTR("AXWIN"), NULL);
GetClientRect(&m_rcPos);
m_pxSize.cx = m_rcPos.right - m_rcPos.left;
m_pxSize.cy = m_rcPos.bottom - m_rcPos.top;
AtlPixelToHiMetric(&m_pxSize, &m_hmSize);
m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize);
m_spOleObject->GetExtent(DVASPECT_CONTENT, &m_hmSize);
AtlHiMetricToPixel(&m_hmSize, &m_pxSize);
m_rcPos.right = m_rcPos.left + m_pxSize.cx;
m_rcPos.bottom = m_rcPos.top + m_pxSize.cy;
CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());
hr = m_spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos);
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
}
CComPtr<IObjectWithSite> spSite;
pUnkControl->QueryInterface(IID_IObjectWithSite, (void**)&spSite);
if (spSite != NULL)
spSite->SetSite(GetControllingUnknown());
return hr;
}
// pointers
CComPtr<IUnknown> m_spUnknown;
CComPtr<IOleObject> m_spOleObject;
CComPtr<IOleInPlaceFrame> m_spInPlaceFrame;
CComPtr<IOleInPlaceUIWindow> m_spInPlaceUIWindow;
CComPtr<IViewObjectEx> m_spViewObject;
CComPtr<IOleInPlaceObjectWindowless> m_spInPlaceObjectWindowless;
CComPtr<IDispatch> m_spExternalDispatch;
#ifndef _ATL_NO_DOCHOSTUIHANDLER
CComPtr<IDocHostUIHandlerDispatch> m_spIDocHostUIHandlerDispatch;
#endif
IID m_iidSink;
DWORD m_dwViewObjectType;
DWORD m_dwAdviseSink;
// state
unsigned long m_bInPlaceActive:1;
unsigned long m_bUIActive:1;
unsigned long m_bMDIApp:1;
unsigned long m_bWindowless:1;
unsigned long m_bCapture:1;
unsigned long m_bHaveFocus:1;
unsigned long m_bReleaseAll:1;
unsigned long m_bLocked:1;
DWORD m_dwOleObject;
DWORD m_dwMiscStatus;
SIZEL m_hmSize;
SIZEL m_pxSize;
RECT m_rcPos;
HACCEL m_hac; // *****added*****
// Ambient property storage
unsigned long m_bCanWindowlessActivate:1;
unsigned long m_bUserMode:1;
unsigned long m_bDisplayAsDefault:1;
unsigned long m_bMessageReflect:1;
unsigned long m_bSubclassed:1;
unsigned long m_bAllowContextMenu:1;
unsigned long m_bAllowShowUI:1;
OLE_COLOR m_clrBackground;
OLE_COLOR m_clrForeground;
LCID m_lcidLocaleID;
CComPtr<IFontDisp> m_spFont;
CComPtr<IServiceProvider> m_spServices;
DWORD m_dwDocHostFlags;
DWORD m_dwDocHostDoubleClickFlags;
CComBSTR m_bstrOptionKeyPath;
DWORD m_dwDLControlFlags;
void SubclassWindow(HWND hWnd)
{
m_bSubclassed = CWindowImpl<CAxHostWindow>::SubclassWindow(hWnd);
}
void ReleaseWindow()
{
if (m_bSubclassed)
{
if(UnsubclassWindow(TRUE) != NULL)
m_bSubclassed = FALSE;
}
else
DestroyWindow();
}
// Reflection
LRESULT ReflectNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HWND hWndChild = NULL;
switch(uMsg)
{
case WM_COMMAND:
if(lParam != NULL) // not from a menu
hWndChild = (HWND)lParam;
break;
case WM_NOTIFY:
hWndChild = ((LPNMHDR)lParam)->hwndFrom;
break;
case WM_PARENTNOTIFY:
switch(LOWORD(wParam))
{
case WM_CREATE:
case WM_DESTROY:
hWndChild = (HWND)lParam;
break;
default:
hWndChild = GetDlgItem(HIWORD(wParam));
break;
}
break;
case WM_DRAWITEM:
if(wParam) // not from a menu
hWndChild = ((LPDRAWITEMSTRUCT)lParam)->hwndItem;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -