// .h
class CCustomControlSite:
public COleControlSite

{
public:

CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}

BEGIN_INTERFACE_PART(DocHostShowUI, IDocHostShowUI)

INIT_INTERFACE_PART(CDocHostSite, DocHostShowUI)

STDMETHOD(ShowHelp)(
/* [in ] */ HWND hwnd,
/* [in ] */ LPOLESTR pszHelpFile,
/* [in ] */ UINT uCommand,
/* [in ] */ DWORD dwData,
/* [in ] */ POINT ptMouse,
/* [out] */ IDispatch __RPC_FAR *pDispatchObjectHit);

STDMETHOD(ShowMessage)(
/* [in ] */ HWND hwnd,
/* [in ] */ LPOLESTR lpstrText,
/* [in ] */ LPOLESTR lpstrCaption,
/* [in ] */ DWORD dwType,
/* [in ] */ LPOLESTR lpstrHelpFile,
/* [in ] */ DWORD dwHelpContext,
/* [out] */ LRESULT __RPC_FAR *plResult);

END_INTERFACE_PART(DocHostShowUI)
protected:

DECLARE_INTERFACE_MAP();

BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)

STDMETHOD(ShowContextMenu)(
/* [in] */ DWORD dwID,
/* [in] */ POINT __RPC_FAR *ppt,
/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
/* [in] */ IDispatch __RPC_FAR *pdispReserved);

STDMETHOD(GetHostInfo)(
/* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);

STDMETHOD(ShowUI)(
/* [in] */ DWORD dwID,
/* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
/* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
/* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc);

STDMETHOD(HideUI)(
void);

STDMETHOD(UpdateUI)(
void);

STDMETHOD(EnableModeless)(
/* [in] */ BOOL fEnable);

STDMETHOD(OnDocWindowActivate)(
/* [in] */ BOOL fEnable);

STDMETHOD(OnFrameWindowActivate)(
/* [in] */ BOOL fEnable);

STDMETHOD(ResizeBorder)(
/* [in] */ LPCRECT prcBorder,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
/* [in] */ BOOL fRameWindow);

STDMETHOD(TranslateAccelerator)(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID);

STDMETHOD(GetOptionKeyPath)(
/* [out] */ LPOLESTR __RPC_FAR *pchKey,
/* [in] */ DWORD dw);

STDMETHOD(GetDropTarget)(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget);

STDMETHOD(GetExternal)(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch);

STDMETHOD(TranslateUrl)(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut);

STDMETHOD(FilterDataObject)(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet);

END_INTERFACE_PART(DocHostUIHandler)

};

class CCustomOccManager :
public COccManager

{
public:

CCustomOccManager(){}

COleControlSite* CreateSite(COleControlContainer* pCtrlCont)

{

CCustomControlSite *pSite =
new CCustomControlSite(pCtrlCont);
return pSite;

}

};
// .cpp
BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite)

INTERFACE_PART(CCustomControlSite, IID_IDocHostShowUI, DocHostShowUI)

INTERFACE_PART(CCustomControlSite, IID_IDocHostUIHandler, DocHostUIHandler)

END_INTERFACE_MAP()


ULONG CCustomControlSite::XDocHostShowUI::AddRef()

{

METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
return pThis->ExternalAddRef();

}

ULONG CCustomControlSite::XDocHostShowUI::Release()

{

METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
return pThis->ExternalRelease();

}

HRESULT CCustomControlSite::XDocHostShowUI::QueryInterface(REFIID riid,
void ** ppvObj)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
return pThis->ExternalQueryInterface( &riid, ppvObj );

}


HRESULT CCustomControlSite::XDocHostShowUI::ShowHelp(HWND hwnd,

LPOLESTR pszHelpFile,

UINT nCommand,

DWORD dwData,

POINT ptMouse,

IDispatch * pDispatchObjectHit)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
return S_OK;

}

HRESULT CCustomControlSite::XDocHostShowUI::ShowMessage(HWND hwnd,

LPOLESTR lpstrText,

LPOLESTR lpstrCaption,

DWORD dwType,

LPOLESTR lpstrHelpFile,

DWORD dwHelpContext,

LRESULT * plResult)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);

MessageBox(hwnd, (CString)lpstrText, _T(
"Cpp & JavaScript"),
/*dwType*/MB_ICONWARNING);
return S_OK;

}


ULONG FAR EXPORT CCustomControlSite::XDocHostUIHandler::AddRef()

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return pThis->ExternalAddRef();

}


ULONG FAR EXPORT CCustomControlSite::XDocHostUIHandler::Release()

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return pThis->ExternalRelease();

}

HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::QueryInterface(REFIID riid,
void **ppvObj)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)

HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
return hr;

}
// * CImpIDocHostUIHandler::GetHostInfo
// *
// * Purpose: Called at initialization
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::GetHostInfo( DOCHOSTUIINFO* pInfo )

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)

pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;

pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
return S_OK;

}
// * CImpIDocHostUIHandler::ShowUI
// *
// * Purpose: Called when MSHTML.DLL shows its UI
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::ShowUI(

DWORD dwID,

IOleInPlaceActiveObject *
/*pActiveObject*/,

IOleCommandTarget * pCommandTarget,

IOleInPlaceFrame *
/*pFrame*/,

IOleInPlaceUIWindow *
/*pDoc*/)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
// We've already got our own UI in place so just return S_OK
return S_OK;

}
// * CImpIDocHostUIHandler::HideUI
// *
// * Purpose: Called when MSHTML.DLL hides its UI
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::HideUI(
void)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return S_OK;

}
// * CImpIDocHostUIHandler::UpdateUI
// *
// * Purpose: Called when MSHTML.DLL updates its UI
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::UpdateUI(
void)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
// MFC is pretty good about updating it's UI in it's Idle loop so I don't do anything here
return S_OK;

}
// * CImpIDocHostUIHandler::EnableModeless
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::EnableModeless
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::EnableModeless(BOOL
/*fEnable*/)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}
// * CImpIDocHostUIHandler::OnDocWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnDocWindowActivate
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL
/*fActivate*/)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}
// * CImpIDocHostUIHandler::OnFrameWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnFrameWindowActivate
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::OnFrameWindowActivate(BOOL
/*fActivate*/)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}
// * CImpIDocHostUIHandler::ResizeBorder
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::ResizeBorder
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::ResizeBorder(

LPCRECT
/*prcBorder*/,

IOleInPlaceUIWindow*
/*pUIWindow*/,

BOOL
/*fRameWindow*/)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}
// * CImpIDocHostUIHandler::ShowContextMenu
// *
// * Purpose: Called when MSHTML.DLL would normally display its context menu
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::ShowContextMenu(

DWORD
/*dwID*/,

POINT* pptPosition,

IUnknown*
/*pCommandTarget*/,

IDispatch*
/*pDispatchObjectHit*/)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}
// * CImpIDocHostUIHandler::TranslateAccelerator
// *
// * Purpose: Called from MSHTML.DLL's TranslateAccelerator routines
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
//disable F5
if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(VK_F5) < 0)
return S_OK;
if(GetKeyState(VK_CONTROL) & 0x8000)

{
//disable ctrl + O
if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(0x4F) < 0)
return S_OK;
//disable ctrl + p
if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(0x50) < 0)
return S_OK;
//disable ctrl + N
if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(0x4E) < 0)
return S_OK;

}
//disable back space
if(lpMsg->wParam == VK_BACK)
return S_OK;
return S_FALSE;

}
// * CImpIDocHostUIHandler::GetOptionKeyPath
// *
// * Purpose: Called by MSHTML.DLL to find where the host wishes to store
// * its options in the registry
// *
HRESULT FAR EXPORT CCustomControlSite::XDocHostUIHandler::GetOptionKeyPath(BSTR* pbstrKey, DWORD)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetDropTarget(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}


STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetExternal(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)

{
// return the IDispatch we have for extending the object Model
IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM;

pDisp->AddRef();

*ppDispatch = pDisp;
return S_OK;

}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::TranslateUrl(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::FilterDataObject(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)

{

METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
return E_NOTIMPL;

}