📄 atlhostex.h
字号:
// This is a part of the Active Template Library.
// Copyright (C) 1996-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Active Template Library Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Active Template Library product.
#ifndef __ATLHOST_H__
#define __ATLHOST_H__
#include <urlmon.h>
#include <mshtml.h>
#include <mshtmhst.h>
#include <exdisp.h>
#ifndef _ATL_AXHOST
#define _ATL_AXHOST
#endif //_ATL_AXHOST
#include <atlwin.h>
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLCOM_H__
#error atlhost.h requires atlcom.h to be included first
#endif
#ifdef _ATL_NO_HOSTING
#error atlhost.h requires Hosting support (_ATL_NO_HOSTING is defined)
#endif //_ATL_NO_HOSTING
namespace ATL
{
//AtlAxWinTerm is not exported
inline BOOL AtlAxWinTerm()
{
#ifndef _ATL_DLL //don't unregister DLL's version
UnregisterClass(CAxWindow::GetWndClassName(), _Module.GetModuleInstance());
#endif
return TRUE;
}
// Define this to host SHDOCVW rather than MSHTML
#define SHDOCVW
UINT __declspec(selectany) WM_ATLGETHOST = 0;
UINT __declspec(selectany) WM_ATLGETCONTROL = 0;
//EXTERN_C const IID IID_IHTMLDocument2 = {0x332C4425,0x26CB,0x11D0,{0xB4,0x83,0x00,0xC0,0x4F,0xD9,0x01,0x19}};
typedef HRESULT (__stdcall *typeMkParseDisplayName)(IBindCtx*, LPCWSTR , ULONG*, LPMONIKER*);
static HRESULT CreateNormalizedObject(LPCOLESTR lpszTricsData, REFIID riid, void** ppvObj, bool& bWasHTML)
{
ATLASSERT(ppvObj);
CLSID clsid;
HRESULT hr = E_FAIL;
BOOL bInited = FALSE;
bWasHTML = false;
*ppvObj = NULL;
if (lpszTricsData == NULL || lpszTricsData[0] == 0)
return S_OK;
// Is it 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(':')))
{
// It's HTML, so let's create mshtml
hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_SERVER, riid, ppvObj);
bWasHTML = true;
}
if (FAILED(hr))
{
// Can't be clsid, or progid if length is grater than 255
if (ocslen(lpszTricsData) < 255)
{
if (lpszTricsData[0] == '{') // Is it a CLSID?
hr = CLSIDFromString((LPOLESTR)lpszTricsData, &clsid);
else
hr = CLSIDFromProgID((LPOLESTR)lpszTricsData, &clsid); // How about a ProgID?
if (SUCCEEDED(hr)) // Aha, it was one of those two
hr = CoCreateInstance(clsid, NULL, CLSCTX_SERVER, riid, ppvObj);
}
if (FAILED(hr))
{
// Last guess - it must be either a URL so let's create shdocvw
if (_bMozilla) {
hr = CoCreateInstance(CLSID_MozillaBrowser, NULL, CLSCTX_SERVER, riid, ppvObj);
if (FAILED(hr))
hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_SERVER, riid, ppvObj);
}
else {
hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_SERVER, riid, ppvObj);
}
bWasHTML = true;
}
}
if (SUCCEEDED(hr) && bInited)
hr = S_FALSE;
return hr;
}
class ATL_NO_VTABLE CAxFrameWindow :
public CComObjectRootEx<CComObjectThreadModel>,
public CWindowImpl<CAxFrameWindow>,
public IOleInPlaceFrame
{
public:
CAxFrameWindow()
{
}
void FinalRelease()
{
m_spActiveObject.Release();
if (m_hWnd)
DestroyWindow();
}
DECLARE_POLY_AGGREGATABLE(CAxFrameWindow)
BEGIN_COM_MAP(CAxFrameWindow)
COM_INTERFACE_ENTRY(IOleInPlaceFrame)
COM_INTERFACE_ENTRY(IOleInPlaceUIWindow)
COM_INTERFACE_ENTRY(IOleWindow)
END_COM_MAP()
DECLARE_EMPTY_MSG_MAP()
// IOleWindow
STDMETHOD(GetWindow)(HWND* phwnd)
{
if (m_hWnd == NULL)
{
RECT rcPos = { CW_USEDEFAULT, 0, 0, 0 };
Create(NULL, rcPos, _T("AXWIN Frame Window"), WS_OVERLAPPEDWINDOW, 0, (UINT)NULL);
}
*phwnd = m_hWnd;
return S_OK;
}
STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/)
{
return S_OK;
}
// IOleInPlaceUIWindow
STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/)
{
return S_OK;
}
STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return INPLACE_E_NOTOOLSPACE;
}
STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return S_OK;
}
STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/)
{
m_spActiveObject = pActiveObject;
return S_OK;
}
// IOleInPlaceFrameWindow
STDMETHOD(InsertMenus)(HMENU /*hmenuShared*/, LPOLEMENUGROUPWIDTHS /*lpMenuWidths*/)
{
return S_OK;
}
STDMETHOD(SetMenu)(HMENU /*hmenuShared*/, HOLEMENU /*holemenu*/, HWND /*hwndActiveObject*/)
{
return S_OK;
}
STDMETHOD(RemoveMenus)(HMENU /*hmenuShared*/)
{
return S_OK;
}
STDMETHOD(SetStatusText)(LPCOLESTR /*pszStatusText*/)
{
return S_OK;
}
STDMETHOD(EnableModeless)(BOOL /*fEnable*/)
{
return S_OK;
}
STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, WORD /*wID*/)
{
return S_FALSE;
}
CComPtr<IOleInPlaceActiveObject> m_spActiveObject;
};
class ATL_NO_VTABLE CAxUIWindow :
public CComObjectRootEx<CComObjectThreadModel>,
public CWindowImpl<CAxUIWindow>,
public IOleInPlaceUIWindow
{
public:
CAxUIWindow()
{
}
void FinalRelease()
{
m_spActiveObject.Release();
if (m_hWnd)
DestroyWindow();
}
DECLARE_POLY_AGGREGATABLE(CAxUIWindow)
BEGIN_COM_MAP(CAxUIWindow)
COM_INTERFACE_ENTRY(IOleInPlaceUIWindow)
COM_INTERFACE_ENTRY(IOleWindow)
END_COM_MAP()
DECLARE_EMPTY_MSG_MAP()
// IOleWindow
STDMETHOD(GetWindow)(HWND* phwnd)
{
if (m_hWnd == NULL)
{
RECT rcPos = { CW_USEDEFAULT, CW_USEDEFAULT, 0, 0 };
Create(NULL, rcPos, _T("AXWIN UI Window"), WS_OVERLAPPEDWINDOW, 0, (UINT)NULL);
}
*phwnd = m_hWnd;
return S_OK;
}
STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/)
{
return S_OK;
}
// IOleInPlaceUIWindow
STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/)
{
return S_OK;
}
STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return INPLACE_E_NOTOOLSPACE;
}
STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return S_OK;
}
STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/)
{
m_spActiveObject = pActiveObject;
return S_OK;
}
CComPtr<IOleInPlaceActiveObject> m_spActiveObject;
};
/////////////////////////////////////////////////////////////////////////////
// CAxHostWindow
// This class is not cocreateable
class ATL_NO_VTABLE CAxHostWindow :
public CComCoClass<CAxHostWindow , &CLSID_NULL>,
public CComObjectRootEx<CComSingleThreadModel>,
public CWindowImpl<CAxHostWindow>,
public IAxWinHostWindow,
public IOleClientSite,
public IOleInPlaceSiteWindowless,
public IOleControlSite,
public IOleContainer,
public IObjectWithSiteImpl<CAxHostWindow>,
public IServiceProvider,
public IAdviseSink,
#ifndef _ATL_NO_DOCHOSTUIHANDLER
public IDocHostUIHandler,
#endif
public IDispatchImpl<IAxWinAmbientDispatchEx, &IID_IAxWinAmbientDispatchEx, &LIBID_ATLLib>,
public IScriptErrorCommandTargetImpl<CAxHostWindow>
{
public:
///////////////////////////////////////////////////////////////////////////
// For DISPID_AMBIENT_DLCONTROL, tell me better way if you know.
STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
if (dispidMember == DISPID_AMBIENT_DLCONTROL) {
ATLTRACE2(atlTraceUser, 4, _T("DISPID_AMBIENT_DLCONTROL is sent!!!\n"));
::VariantInit(pvarResult);
CComVariant var(m_dwDLControlFlags, VT_I4);
return var.Detach(pvarResult);
}
return _tih.Invoke((IDispatch*)this, dispidMember, riid, lcid,
wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
}
STDMETHOD(put_DLControlFlags)(DWORD dwDLControlFlags)
{
m_dwDLControlFlags = dwDLControlFlags;
FireAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL); // still required for IE5.5, fixed by fub!
return S_OK;
}
STDMETHOD(get_DLControlFlags)(DWORD* dwDLControlFlags)
{
*dwDLControlFlags = m_dwDLControlFlags;
return S_OK;
} //
///////////////////////////////////////////////////////////////////////////
// ctor/dtor
CAxHostWindow()
{
m_bInPlaceActive = FALSE;
m_bUIActive = FALSE;
m_bMDIApp = TRUE; // ***changed***
m_bWindowless = FALSE;
m_bCapture = FALSE;
m_bHaveFocus = FALSE;
// Initialize ambient properties
m_bCanWindowlessActivate = TRUE;
m_bUserMode = TRUE;
m_bDisplayAsDefault = FALSE;
m_clrBackground = NULL;
m_clrForeground = GetSysColor(COLOR_WINDOWTEXT);
m_lcidLocaleID = LOCALE_USER_DEFAULT;
m_bMessageReflect = true;
m_bReleaseAll = FALSE;
m_bSubclassed = FALSE;
m_dwAdviseSink = 0xCDCDCDCD;
m_dwDocHostFlags = DOCHOSTUIFLAG_NO3DBORDER;
m_dwDocHostDoubleClickFlags = DOCHOSTUIDBLCLK_DEFAULT;
m_bAllowContextMenu = true;
m_bAllowShowUI = false;
m_dwDLControlFlags = DLCTL_DLIMAGES | DLCTL_VIDEOS | DLCTL_BGSOUNDS; // ***added***
m_hac = NULL;
}
~CAxHostWindow()
{
}
void FinalRelease()
{
ReleaseAll();
}
virtual void OnFinalMessage(HWND /*hWnd*/)
{
GetControllingUnknown()->Release();
}
DECLARE_NO_REGISTRY()
DECLARE_POLY_AGGREGATABLE(CAxHostWindow)
DECLARE_GET_CONTROLLING_UNKNOWN()
BEGIN_COM_MAP(CAxHostWindow)
COM_INTERFACE_ENTRY2(IDispatch, IAxWinAmbientDispatchEx)
COM_INTERFACE_ENTRY(IAxWinHostWindow)
COM_INTERFACE_ENTRY(IOleClientSite)
COM_INTERFACE_ENTRY(IOleInPlaceSiteWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)
COM_INTERFACE_ENTRY(IOleInPlaceSite)
COM_INTERFACE_ENTRY(IOleWindow)
COM_INTERFACE_ENTRY(IOleControlSite)
COM_INTERFACE_ENTRY(IOleContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IServiceProvider)
COM_INTERFACE_ENTRY(IAxWinAmbientDispatchEx)
#ifndef _ATL_NO_DOCHOSTUIHANDLER
COM_INTERFACE_ENTRY(IDocHostUIHandler)
#endif
COM_INTERFACE_ENTRY(IAdviseSink)
COM_INTERFACE_ENTRY(IOleCommandTarget)
END_COM_MAP()
static CWndClassInfo& GetWndClassInfo()
{
static CWndClassInfo wc =
{
{ sizeof(WNDCLASSEX), 0, StartWindowProc,
0, 0, 0, 0, 0, (HBRUSH)(COLOR_WINDOW + 1), 0, _T("AtlAxWin"), 0 },
NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
};
return wc;
}
BEGIN_MSG_MAP(CAxHostWindow)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
if (m_bWindowless)
{
// Mouse messages handled when a windowless control has captured the cursor
// or if the cursor is over the control
DWORD dwHitResult = m_bCapture ? HITRESULT_HIT : HITRESULT_OUTSIDE;
if (dwHitResult == HITRESULT_OUTSIDE && m_spViewObject != NULL)
{
POINT ptMouse = { LOWORD(lParam), HIWORD(lParam) };
m_spViewObject->QueryHitPoint(DVASPECT_CONTENT, &m_rcPos, ptMouse, 0, &dwHitResult);
}
if (dwHitResult == HITRESULT_HIT)
{
MESSAGE_HANDLER(WM_MOUSEMOVE, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_SETCURSOR, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_LBUTTONUP, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_RBUTTONUP, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_MBUTTONUP, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_RBUTTONDOWN, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_MBUTTONDOWN, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnWindowlessMouseMessage)
MESSAGE_HANDLER(WM_MBUTTONDBLCLK, OnWindowlessMouseMessage)
}
}
if (m_bWindowless & m_bHaveFocus)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -