📄 atlhostex.h
字号:
{
// Keyboard messages handled only when a windowless control has the focus
MESSAGE_HANDLER(WM_KEYDOWN, OnWindowMessage)
MESSAGE_HANDLER(WM_KEYUP, OnWindowMessage)
MESSAGE_HANDLER(WM_CHAR, OnWindowMessage)
MESSAGE_HANDLER(WM_DEADCHAR, OnWindowMessage)
MESSAGE_HANDLER(WM_SYSKEYDOWN, OnWindowMessage)
MESSAGE_HANDLER(WM_SYSKEYUP, OnWindowMessage)
MESSAGE_HANDLER(WM_SYSDEADCHAR, OnWindowMessage)
MESSAGE_HANDLER(WM_HELP, OnWindowMessage)
MESSAGE_HANDLER(WM_CANCELMODE, OnWindowMessage)
MESSAGE_HANDLER(WM_IME_CHAR, OnWindowMessage)
MESSAGE_HANDLER(WM_MBUTTONDBLCLK, OnWindowMessage)
MESSAGE_RANGE_HANDLER(WM_IME_SETCONTEXT, WM_IME_KEYUP, OnWindowMessage)
}
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
if(!m_bWindowless && m_bMessageReflect)
{
bHandled = TRUE;
lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled);
if(bHandled)
return TRUE;
}
MESSAGE_HANDLER(WM_ATLGETHOST, OnGetUnknown)
MESSAGE_HANDLER(WM_ATLGETCONTROL, OnGetControl)
MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
END_MSG_MAP()
LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
ATLASSERT(lParam != 0);
LPMSG lpMsg = (LPMSG)lParam;
CComQIPtr<IOleInPlaceActiveObject, &IID_IOleInPlaceActiveObject> spInPlaceActiveObject(m_spUnknown);
if(spInPlaceActiveObject)
{
if(spInPlaceActiveObject->TranslateAccelerator(lpMsg) == S_OK)
return 1;
}
return 0;
}
LRESULT OnGetUnknown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
IUnknown* pUnk = GetControllingUnknown();
pUnk->AddRef();
return (LRESULT)pUnk;
}
LRESULT OnGetControl(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
IUnknown* pUnk = m_spUnknown;
if (pUnk)
pUnk->AddRef();
return (LRESULT)pUnk;
}
void ReleaseAll()
{
if (m_bReleaseAll)
return;
m_bReleaseAll = TRUE;
if (m_spViewObject != NULL)
m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, NULL);
if(m_dwAdviseSink != 0xCDCDCDCD)
{
AtlUnadvise(m_spUnknown, m_iidSink, m_dwAdviseSink);
m_dwAdviseSink = 0xCDCDCDCD;
}
if (m_spOleObject)
{
m_spOleObject->Unadvise(m_dwOleObject);
m_spOleObject->Close(OLECLOSE_NOSAVE);
m_spOleObject->SetClientSite(NULL);
}
if (m_spUnknown != NULL)
{
CComPtr<IObjectWithSite> spSite;
m_spUnknown->QueryInterface(IID_IObjectWithSite, (void**)&spSite);
if (spSite != NULL)
spSite->SetSite(NULL);
}
m_spViewObject.Release();
m_dwViewObjectType = 0;
m_spInPlaceObjectWindowless.Release();
m_spOleObject.Release();
m_spUnknown.Release();
m_spInPlaceUIWindow.Release();
m_spInPlaceFrame.Release();
m_bInPlaceActive = FALSE;
m_bWindowless = FALSE;
m_bInPlaceActive = FALSE;
m_bUIActive = FALSE;
m_bCapture = FALSE;
m_bReleaseAll = FALSE;
if (m_hac) {
::DestroyAcceleratorTable(m_hac);
m_hac = NULL;
}
}
// window message handlers
LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if (m_spViewObject == NULL)
bHandled = false;
return 1;
}
LRESULT OnNCHitTest(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return HTCLIENT;
}
LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
m_bHaveFocus = TRUE;
if (!m_bReleaseAll)
{
if (m_spOleObject != NULL && !m_bInPlaceActive)
{
CComPtr<IOleClientSite> spClientSite;
GetControllingUnknown()->QueryInterface(IID_IOleClientSite, (void**)&spClientSite);
if (spClientSite != NULL)
m_spOleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos);
}
if(!m_bWindowless && !IsChild(::GetFocus()))
::SetFocus(::GetWindow(m_hWnd, GW_CHILD));
}
bHandled = FALSE;
return 0;
}
LRESULT OnKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
m_bHaveFocus = FALSE;
bHandled = FALSE;
return 0;
}
LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
int nWidth = LOWORD(lParam); // width of client area
int nHeight = HIWORD(lParam); // height of client area
m_rcPos.right = m_rcPos.left + nWidth;
m_rcPos.bottom = m_rcPos.top + nHeight;
m_pxSize.cx = m_rcPos.right - m_rcPos.left;
m_pxSize.cy = m_rcPos.bottom - m_rcPos.top;
AtlPixelToHiMetric(&m_pxSize, &m_hmSize);
if (m_spOleObject)
m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize);
if (m_spInPlaceObjectWindowless)
m_spInPlaceObjectWindowless->SetObjectRects(&m_rcPos, &m_rcPos);
if (m_bWindowless)
InvalidateRect(NULL, TRUE);
bHandled = FALSE;
return 0;
}
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
GetControllingUnknown()->AddRef();
ReleaseAll();
DefWindowProc(uMsg, wParam, lParam);
bHandled = FALSE;
return 0;
}
LRESULT OnWindowMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lRes = 0;
HRESULT hr = S_FALSE;
if (m_bInPlaceActive && m_bWindowless && m_spInPlaceObjectWindowless)
hr = m_spInPlaceObjectWindowless->OnWindowMessage(uMsg, wParam, lParam, &lRes);
if (hr == S_FALSE)
bHandled = FALSE;
return lRes;
}
LRESULT OnWindowlessMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lRes = 0;
if (m_bInPlaceActive && m_bWindowless && m_spInPlaceObjectWindowless)
m_spInPlaceObjectWindowless->OnWindowMessage(uMsg, wParam, lParam, &lRes);
bHandled = FALSE;
return lRes;
}
LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if (m_spViewObject == NULL)
{
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(m_hWnd, &ps);
if (hdc == NULL)
return 0;
RECT rcClient;
GetClientRect(&rcClient);
HBRUSH hbrBack = CreateSolidBrush(m_clrBackground);
FillRect(hdc, &rcClient, hbrBack);
DeleteObject(hbrBack);
::EndPaint(m_hWnd, &ps);
return 1;
}
if (m_spViewObject && m_bWindowless)
{
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(m_hWnd, &ps);
if (hdc == NULL)
return 0;
RECT rcClient;
GetClientRect(&rcClient);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
HDC hdcCompatible = ::CreateCompatibleDC(hdc);
HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcCompatible, hBitmap);
HBRUSH hbrBack = CreateSolidBrush(m_clrBackground);
FillRect(hdcCompatible, &rcClient, hbrBack);
DeleteObject(hbrBack);
m_spViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdcCompatible, (RECTL*)&m_rcPos, (RECTL*)&m_rcPos, NULL, NULL);
::BitBlt(hdc, 0, 0, rcClient.right, rcClient.bottom, hdcCompatible, 0, 0, SRCCOPY);
::SelectObject(hdcCompatible, hBitmapOld);
::DeleteObject(hBitmap);
::DeleteDC(hdcCompatible);
::EndPaint(m_hWnd, &ps);
}
else
{
bHandled = FALSE;
return 0;
}
return 1;
}
// IAxWinHostWindow
STDMETHOD(CreateControl)(LPCOLESTR lpTricsData, HWND hWnd, IStream* pStream)
{
CComPtr<IUnknown> p;
return CreateControlEx(lpTricsData, hWnd, pStream, &p, IID_NULL, NULL);
}
STDMETHOD(CreateControlEx)(LPCOLESTR lpszTricsData, HWND hWnd, IStream* pStream, IUnknown** ppUnk, REFIID iidAdvise, IUnknown* punkSink)
{
HRESULT hr = S_FALSE;
ReleaseAll();
if (m_hWnd != NULL)
{
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
ReleaseWindow();
}
if (::IsWindow(hWnd))
{
USES_CONVERSION;
SubclassWindow(hWnd);
if (m_clrBackground == NULL)
{
if (IsParentDialog())
m_clrBackground = GetSysColor(COLOR_BTNFACE);
else
m_clrBackground = GetSysColor(COLOR_WINDOW);
}
bool bWasHTML;
hr = CreateNormalizedObject(lpszTricsData, IID_IUnknown, (void**)ppUnk, bWasHTML);
bool bInited = hr == S_FALSE;
if (SUCCEEDED(hr))
hr = ActivateAx(*ppUnk, bInited, pStream);
//Try to hook up any sink the user might have given us.
m_iidSink = iidAdvise;
if(SUCCEEDED(hr) && *ppUnk && punkSink)
AtlAdvise(*ppUnk, punkSink, m_iidSink, &m_dwAdviseSink);
if (SUCCEEDED(hr) && bWasHTML && *ppUnk != NULL)
{
if ((GetStyle() & (WS_VSCROLL | WS_HSCROLL)) == 0)
m_dwDocHostFlags |= DOCHOSTUIFLAG_SCROLL_NO;
else
{
DWORD dwStyle = GetStyle();
SetWindowLong(GWL_STYLE, dwStyle & ~(WS_VSCROLL | WS_HSCROLL));
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_DRAWFRAME);
}
CComPtr<IUnknown> spUnk(*ppUnk);
// Is it just plain HTML?
USES_CONVERSION;
if ((lpszTricsData[0] == OLECHAR('M') || lpszTricsData[0] == OLECHAR('m')) &&
(lpszTricsData[1] == OLECHAR('S') || lpszTricsData[1] == OLECHAR('s')) &&
(lpszTricsData[2] == OLECHAR('H') || lpszTricsData[2] == OLECHAR('h')) &&
(lpszTricsData[3] == OLECHAR('T') || lpszTricsData[3] == OLECHAR('t')) &&
(lpszTricsData[4] == OLECHAR('M') || lpszTricsData[4] == OLECHAR('m')) &&
(lpszTricsData[5] == OLECHAR('L') || lpszTricsData[5] == OLECHAR('l')) &&
(lpszTricsData[6] == OLECHAR(':')))
{
// Just HTML, eh?
CComPtr<IPersistStreamInit> spPSI;
hr = spUnk->QueryInterface(IID_IPersistStreamInit, (void**)&spPSI);
spPSI->InitNew();
bInited = TRUE;
CComPtr<IHTMLDocument2> spHTMLDoc2;
hr = spUnk->QueryInterface(IID_IHTMLDocument2, (void**)&spHTMLDoc2);
if (SUCCEEDED(hr))
{
CComPtr<IHTMLElement> spHTMLBody;
hr = spHTMLDoc2->get_body(&spHTMLBody);
if (SUCCEEDED(hr))
hr = spHTMLBody->put_innerHTML(CComBSTR(lpszTricsData + 7));
}
}
// else
// {
// CComPtr<IWebBrowser2> spBrowser;
// spUnk->QueryInterface(IID_IWebBrowser2, (void**)&spBrowser);
// if (spBrowser)
// {
// CComVariant ve;
// CComVariant vurl(lpszTricsData);
//#pragma warning(disable: 4310) // cast truncates constant value
// spBrowser->put_Visible(VARIANT_TRUE);
//#pragma warning(default: 4310) // cast truncates constant value
// spBrowser->Navigate2(&vurl, &ve, &ve, &ve, &ve);
// }
// }
}
if (FAILED(hr) || m_spUnknown == NULL)
{
// We don't have a control or something failed so release
ReleaseAll();
if (m_hWnd != NULL)
{
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
if (FAILED(hr))
ReleaseWindow();
}
}
}
return hr;
}
STDMETHOD(AttachControl)(IUnknown* pUnkControl, HWND hWnd)
{
HRESULT hr = S_FALSE;
ReleaseAll();
if (m_hWnd != NULL)
{
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
ReleaseWindow();
}
if (::IsWindow(hWnd))
{
SubclassWindow(hWnd);
hr = ActivateAx(pUnkControl, TRUE, NULL);
if (FAILED(hr))
{
ReleaseAll();
if (m_hWnd != NULL)
{
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
ReleaseWindow();
}
}
}
return hr;
}
STDMETHOD(QueryControl)(REFIID riid, void** ppvObject)
{
HRESULT hr = E_POINTER;
if (ppvObject)
{
if (m_spUnknown)
{
hr = m_spUnknown->QueryInterface(riid, ppvObject);
}
else
{
*ppvObject = NULL;
hr = OLE_E_NOCONNECTION;
}
}
return hr;
}
STDMETHOD(SetExternalDispatch)(IDispatch* pDisp)
{
m_spExternalDispatch = pDisp;
return S_OK;
}
STDMETHOD(SetExternalUIHandler)(IDocHostUIHandlerDispatch* pUIHandler)
{
#ifndef _ATL_NO_DOCHOSTUIHANDLER
m_spIDocHostUIHandlerDispatch = pUIHandler;
#endif
return S_OK;
}
#ifndef _ATL_NO_DOCHOSTUIHANDLER
// IDocHostUIHandler
// MSHTML requests to display its context menu
STDMETHOD(ShowContextMenu)(DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch* pDispatchObjectHit)
{
HRESULT hr = m_bAllowContextMenu ? S_FALSE : S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
m_spIDocHostUIHandlerDispatch->ShowContextMenu(
dwID,
pptPosition->x,
pptPosition->y,
pCommandTarget,
pDispatchObjectHit,
&hr);
return hr;
}
// Called at initialisation to find UI styles from container
STDMETHOD(GetHostInfo)(DOCHOSTUIINFO* pInfo)
{
if (pInfo == NULL)
return E_POINTER;
if (m_spIDocHostUIHandlerDispatch != NULL)
return m_spIDocHostUIHandlerDispatch->GetHostInfo(&pInfo->dwFlags, &pInfo->dwDoubleClick);
pInfo->dwFlags = m_dwDocHostFlags;
pInfo->dwDoubleClick = m_dwDocHostDoubleClickFlags;
return S_OK;
}
// Allows the host to replace the IE4/MSHTML menus and toolbars.
STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow* pDoc)
{
HRESULT hr = m_bAllowShowUI ? S_FALSE : S_OK;
if (m_spIDocHostUIHandlerDispatch != NULL)
m_spIDocHostUIHandlerDispatch->ShowUI(
dwID,
pActiveObject,
pCommandTarget,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -