📄 atlhostex.h
字号:
pFrame,
pDoc,
&hr);
return hr;
}
// Called when IE4/MSHTML removes its menus and toolbars.
STDMETHOD(HideUI)()
{
HRESULT hr = S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
hr = m_spIDocHostUIHandlerDispatch->HideUI();
return hr;
}
// Notifies the host that the command state has changed.
STDMETHOD(UpdateUI)()
{
HRESULT hr = S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
hr = m_spIDocHostUIHandlerDispatch->UpdateUI();
return hr;
}
// Called from the IE4/MSHTML implementation of IOleInPlaceActiveObject::EnableModeless
STDMETHOD(EnableModeless)(BOOL fEnable)
{
HRESULT hr = S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
#pragma warning(disable: 4310) // cast truncates constant value
hr = m_spIDocHostUIHandlerDispatch->EnableModeless(fEnable ? VARIANT_TRUE : VARIANT_FALSE);
#pragma warning(default: 4310) // cast truncates constant value
return hr;
}
// Called from the IE4/MSHTML implementation of IOleInPlaceActiveObject::OnDocWindowActivate
STDMETHOD(OnDocWindowActivate)(BOOL fActivate)
{
HRESULT hr = S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
#pragma warning(disable: 4310) // cast truncates constant value
hr = m_spIDocHostUIHandlerDispatch->OnDocWindowActivate(fActivate ? VARIANT_TRUE : VARIANT_FALSE);
#pragma warning(default: 4310) // cast truncates constant value
return hr;
}
// Called from the IE4/MSHTML implementation of IOleInPlaceActiveObject::OnFrameWindowActivate.
STDMETHOD(OnFrameWindowActivate)(BOOL fActivate)
{
HRESULT hr = S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
#pragma warning(disable: 4310) // cast truncates constant value
hr = m_spIDocHostUIHandlerDispatch->OnFrameWindowActivate(fActivate ? VARIANT_TRUE : VARIANT_FALSE);
#pragma warning(default: 4310) // cast truncates constant value
return hr;
}
// Called from the IE4/MSHTML implementation of IOleInPlaceActiveObject::ResizeBorder.
STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow* pUIWindow, BOOL fFrameWindow)
{
HRESULT hr = S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
#pragma warning(disable: 4310) // cast truncates constant value
hr = m_spIDocHostUIHandlerDispatch->ResizeBorder(
prcBorder->left,
prcBorder->top,
prcBorder->right,
prcBorder->bottom,
pUIWindow,
fFrameWindow ? VARIANT_TRUE : VARIANT_FALSE);
#pragma warning(default: 4310) // cast truncates constant value
return hr;
}
// Called by IE4/MSHTML when IOleInPlaceActiveObject::TranslateAccelerator or IOleControlSite::TranslateAccelerator is called.
STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID)
{
HRESULT hr = S_FALSE;
if (m_spIDocHostUIHandlerDispatch != NULL)
m_spIDocHostUIHandlerDispatch->TranslateAccelerator(
(DWORD) lpMsg->hwnd,
lpMsg->message,
lpMsg->wParam,
lpMsg->lParam,
CComBSTR(*pguidCmdGroup),
nCmdID,
&hr);
return hr;
}
// Returns the registry key under which IE4/MSHTML stores user preferences.
// Returns S_OK if successful, or S_FALSE otherwise. If S_FALSE, IE4/MSHTML will default to its own user options.
STDMETHOD(GetOptionKeyPath)(BSTR* pbstrKey, DWORD dwReserved)
{
HRESULT hr = S_FALSE;
if (pbstrKey == NULL)
return E_POINTER;
*pbstrKey = NULL;
if (m_spIDocHostUIHandlerDispatch != NULL)
{
hr = m_spIDocHostUIHandlerDispatch->GetOptionKeyPath(pbstrKey, dwReserved);
if (FAILED(hr) || *pbstrKey == NULL)
hr = S_FALSE;
}
else
{
if (m_bstrOptionKeyPath.m_str != NULL)
{
*pbstrKey = m_bstrOptionKeyPath.Copy();
hr = S_OK;
}
}
return hr;
}
// Called by IE4/MSHTML when it is being used as a drop target to allow the host to supply an alternative IDropTarget
STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget** ppDropTarget)
{
HRESULT hr = E_NOTIMPL;
if (ppDropTarget == NULL)
return E_POINTER;
*ppDropTarget = NULL;
if (m_spIDocHostUIHandlerDispatch != NULL)
{
CComPtr<IUnknown> spUnk;
hr = m_spIDocHostUIHandlerDispatch->GetDropTarget(pDropTarget, &spUnk);
if (spUnk)
hr = spUnk->QueryInterface(IID_IDropTarget, (void**)ppDropTarget);
if (FAILED(hr) || *ppDropTarget == NULL)
hr = S_FALSE;
}
return hr;
}
// Called by IE4/MSHTML to obtain the host's IDispatch interface
STDMETHOD(GetExternal)(IDispatch** ppDispatch)
{
HRESULT hr = E_NOINTERFACE;
if (ppDispatch == NULL)
return E_POINTER;
*ppDispatch = NULL;
if (m_spIDocHostUIHandlerDispatch != NULL)
{
hr = m_spIDocHostUIHandlerDispatch->GetExternal(ppDispatch);
if (FAILED(hr) || *ppDispatch == NULL)
hr = E_NOINTERFACE;
}
else
{
// return the IDispatch we have for extending the object Model
if (ppDispatch != NULL)
{
m_spExternalDispatch.CopyTo(ppDispatch);
hr = S_OK;
}
else
hr = E_POINTER;
}
return hr;
}
// Called by IE4/MSHTML to allow the host an opportunity to modify the URL to be loaded
STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut)
{
HRESULT hr = S_FALSE;
if (ppchURLOut == NULL)
return E_POINTER;
*ppchURLOut = NULL;
if (m_spIDocHostUIHandlerDispatch != NULL)
{
CComBSTR bstrURLOut;
hr = m_spIDocHostUIHandlerDispatch->TranslateUrl(dwTranslate, CComBSTR(pchURLIn), &bstrURLOut);
if (SUCCEEDED(hr) && bstrURLOut.m_str != NULL)
{
UINT nLen = (bstrURLOut.Length() + 1) * 2;
*ppchURLOut = (OLECHAR*) CoTaskMemAlloc(nLen);
if (*ppchURLOut == NULL)
return E_OUTOFMEMORY;
memcpy(*ppchURLOut, bstrURLOut.m_str, nLen);
}
else
hr = S_FALSE;
}
return hr;
}
// Called on the host by IE4/MSHTML to allow the host to replace IE4/MSHTML's data object.
// This allows the host to block certain clipboard formats or support additional clipboard formats.
STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet)
{
HRESULT hr = S_FALSE;
if (ppDORet == NULL)
return E_POINTER;
*ppDORet = NULL;
if (m_spIDocHostUIHandlerDispatch != NULL)
{
CComPtr<IUnknown> spUnk;
hr = m_spIDocHostUIHandlerDispatch->FilterDataObject(pDO, &spUnk);
if (spUnk)
hr = QueryInterface(IID_IDataObject, (void**)ppDORet);
if (FAILED(hr) || *ppDORet == NULL)
hr = S_FALSE;
}
return hr;
}
#endif
HRESULT FireAmbientPropertyChange(DISPID dispChanged)
{
HRESULT hr = S_OK;
CComQIPtr<IOleControl, &IID_IOleControl> spOleControl(m_spUnknown);
if (spOleControl != NULL)
hr = spOleControl->OnAmbientPropertyChange(dispChanged);
return hr;
}
// IAxWinAmbientDispatch
STDMETHOD(put_AllowWindowlessActivation)(VARIANT_BOOL bAllowWindowless)
{
m_bCanWindowlessActivate = bAllowWindowless;
return S_OK;
}
STDMETHOD(get_AllowWindowlessActivation)(VARIANT_BOOL* pbAllowWindowless)
{
#pragma warning(disable: 4310) // cast truncates constant value
*pbAllowWindowless = m_bCanWindowlessActivate ? VARIANT_TRUE : VARIANT_FALSE;
#pragma warning(default: 4310) // cast truncates constant value
return S_OK;
}
STDMETHOD(put_BackColor)(OLE_COLOR clrBackground)
{
m_clrBackground = clrBackground;
FireAmbientPropertyChange(DISPID_AMBIENT_BACKCOLOR);
InvalidateRect(0, FALSE);
return S_OK;
}
STDMETHOD(get_BackColor)(OLE_COLOR* pclrBackground)
{
*pclrBackground = m_clrBackground;
return S_OK;
}
STDMETHOD(put_ForeColor)(OLE_COLOR clrForeground)
{
m_clrForeground = clrForeground;
FireAmbientPropertyChange(DISPID_AMBIENT_FORECOLOR);
return S_OK;
}
STDMETHOD(get_ForeColor)(OLE_COLOR* pclrForeground)
{
*pclrForeground = m_clrForeground;
return S_OK;
}
STDMETHOD(put_LocaleID)(LCID lcidLocaleID)
{
m_lcidLocaleID = lcidLocaleID;
FireAmbientPropertyChange(DISPID_AMBIENT_LOCALEID);
return S_OK;
}
STDMETHOD(get_LocaleID)(LCID* plcidLocaleID)
{
*plcidLocaleID = m_lcidLocaleID;
return S_OK;
}
STDMETHOD(put_UserMode)(VARIANT_BOOL bUserMode)
{
m_bUserMode = bUserMode;
FireAmbientPropertyChange(DISPID_AMBIENT_USERMODE);
return S_OK;
}
STDMETHOD(get_UserMode)(VARIANT_BOOL* pbUserMode)
{
#pragma warning(disable: 4310) // cast truncates constant value
*pbUserMode = m_bUserMode ? VARIANT_TRUE : VARIANT_FALSE;
#pragma warning(default: 4310) // cast truncates constant value
return S_OK;
}
STDMETHOD(put_DisplayAsDefault)(VARIANT_BOOL bDisplayAsDefault)
{
m_bDisplayAsDefault = bDisplayAsDefault;
FireAmbientPropertyChange(DISPID_AMBIENT_DISPLAYASDEFAULT);
return S_OK;
}
STDMETHOD(get_DisplayAsDefault)(VARIANT_BOOL* pbDisplayAsDefault)
{
#pragma warning(disable: 4310) // cast truncates constant value
*pbDisplayAsDefault = m_bDisplayAsDefault ? VARIANT_TRUE : VARIANT_FALSE;
#pragma warning(default: 4310) // cast truncates constant value
return S_OK;
}
STDMETHOD(put_Font)(IFontDisp* pFont)
{
m_spFont = pFont;
FireAmbientPropertyChange(DISPID_AMBIENT_FONT);
return S_OK;
}
STDMETHOD(get_Font)(IFontDisp** pFont)
{
if (m_spFont == NULL)
{
USES_CONVERSION;
HFONT hSystemFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT);
if (hSystemFont == NULL)
hSystemFont = (HFONT) GetStockObject(SYSTEM_FONT);
LOGFONT logfont;
GetObject(hSystemFont, sizeof(logfont), &logfont);
FONTDESC fd;
fd.cbSizeofstruct = sizeof(FONTDESC);
fd.lpstrName = T2OLE(logfont.lfFaceName);
fd.sWeight = (short)logfont.lfWeight;
fd.sCharset = logfont.lfCharSet;
fd.fItalic = logfont.lfItalic;
fd.fUnderline = logfont.lfUnderline;
fd.fStrikethrough = logfont.lfStrikeOut;
long lfHeight = logfont.lfHeight;
if (lfHeight < 0)
lfHeight = -lfHeight;
int ppi;
HDC hdc;
if (m_hWnd)
{
hdc = ::GetDC(m_hWnd);
ppi = GetDeviceCaps(hdc, LOGPIXELSY);
::ReleaseDC(m_hWnd, hdc);
}
else
{
hdc = ::GetDC(GetDesktopWindow());
ppi = GetDeviceCaps(hdc, LOGPIXELSY);
::ReleaseDC(GetDesktopWindow(), hdc);
}
fd.cySize.Lo = lfHeight * 720000 / ppi;
fd.cySize.Hi = 0;
OleCreateFontIndirect(&fd, IID_IFontDisp, (void**) &m_spFont);
}
return m_spFont.CopyTo(pFont);
}
STDMETHOD(put_MessageReflect)(VARIANT_BOOL bMessageReflect)
{
m_bMessageReflect = bMessageReflect;
FireAmbientPropertyChange(DISPID_AMBIENT_MESSAGEREFLECT);
return S_OK;
}
STDMETHOD(get_MessageReflect)(VARIANT_BOOL* pbMessageReflect)
{
#pragma warning(disable: 4310) // cast truncates constant value
*pbMessageReflect = m_bMessageReflect ? VARIANT_TRUE : VARIANT_FALSE;
#pragma warning(default: 4310) // cast truncates constant value
return S_OK;
}
STDMETHOD(get_ShowGrabHandles)(VARIANT_BOOL* pbShowGrabHandles)
{
*pbShowGrabHandles = VARIANT_FALSE;
return S_OK;
}
STDMETHOD(get_ShowHatching)(VARIANT_BOOL* pbShowHatching)
{
*pbShowHatching = VARIANT_FALSE;
return S_OK;
}
STDMETHOD(put_DocHostFlags)(DWORD dwDocHostFlags)
{
m_dwDocHostFlags = dwDocHostFlags;
FireAmbientPropertyChange(DISPID_UNKNOWN);
return S_OK;
}
STDMETHOD(get_DocHostFlags)(DWORD* pdwDocHostFlags)
{
*pdwDocHostFlags = m_dwDocHostFlags;
return S_OK;
}
STDMETHOD(put_DocHostDoubleClickFlags)(DWORD dwDocHostDoubleClickFlags)
{
m_dwDocHostDoubleClickFlags = dwDocHostDoubleClickFlags;
return S_OK;
}
STDMETHOD(get_DocHostDoubleClickFlags)(DWORD* pdwDocHostDoubleClickFlags)
{
*pdwDocHostDoubleClickFlags = m_dwDocHostDoubleClickFlags;
return S_OK;
}
STDMETHOD(put_AllowContextMenu)(VARIANT_BOOL bAllowContextMenu)
{
m_bAllowContextMenu = bAllowContextMenu;
return S_OK;
}
STDMETHOD(get_AllowContextMenu)(VARIANT_BOOL* pbAllowContextMenu)
{
#pragma warning(disable: 4310) // cast truncates constant value
*pbAllowContextMenu = m_bAllowContextMenu ? VARIANT_TRUE : VARIANT_FALSE;
#pragma warning(default: 4310) // cast truncates constant value
return S_OK;
}
STDMETHOD(put_AllowShowUI)(VARIANT_BOOL bAllowShowUI)
{
m_bAllowShowUI = bAllowShowUI;
return S_OK;
}
STDMETHOD(get_AllowShowUI)(VARIANT_BOOL* pbAllowShowUI)
{
#pragma warning(disable: 4310) // cast truncates constant value
*pbAllowShowUI = m_bAllowShowUI ? VARIANT_TRUE : VARIANT_FALSE;
#pragma warning(default: 4310) // cast truncates constant value
return S_OK;
}
STDMETHOD(put_OptionKeyPath)(BSTR bstrOptionKeyPath)
{
m_bstrOptionKeyPath = bstrOptionKeyPath;;
return S_OK;
}
STDMETHOD(get_OptionKeyPath)(BSTR* pbstrOptionKeyPath)
{
*pbstrOptionKeyPath = m_bstrOptionKeyPath;
return S_OK;
}
// IObjectWithSite
STDMETHOD(SetSite)(IUnknown* pUnkSite)
{
HRESULT hr = IObjectWithSiteImpl<CAxHostWindow>::SetSite(pUnkSite);
if (SUCCEEDED(hr) && m_spUnkSite)
{
// Look for "outer" IServiceProvider
hr = m_spUnkSite->QueryInterface(IID_IServiceProvider, (void**)&m_spServices);
ATLASSERT( !hr && "No ServiceProvider!" );
}
if (pUnkSite == NULL)
m_spServices.Release();
return hr;
}
// IOleClientSite
STDMETHOD(SaveObject)()
{
ATLTRACENOTIMPL(_T("IOleClientSite::SaveObject"));
}
STDMETHOD(GetMoniker)(DWORD /*dwAssign*/, DWORD /*dwWhichMoniker*/, IMoniker** /*ppmk*/)
{
ATLTRACENOTIMPL(_T("IOleClientSite::GetMoniker"));
}
STDMETHOD(GetContainer)(IOleContainer** ppContainer)
{
ATLTRACE2(atlTraceHosting, 0, _T("IOleClientSite::GetContainer\n"));
HRESULT hr = E_POINTER;
if (ppContainer)
{
hr = E_NOTIMPL;
(*ppContainer) = NULL;
if (m_spUnkSite)
hr = m_spUnkSite->QueryInterface(IID_IOleContainer, (void**)ppContainer);
if (FAILED(hr))
hr = QueryInterface(IID_IOleContainer, (void**)ppContainer);
}
return hr;
}
STDMETHOD(ShowObject)()
{
ATLTRACE2(atlTraceHosting, 0, _T("IOleClientSite::ShowObject\r\n"));
HDC hdc = CWindowImpl<CAxHostWindow>::GetDC();
if (hdc == NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -