761 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			761 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Win32++   Version 7.2
 | 
						|
// Released: 5th AUgust 2011
 | 
						|
//
 | 
						|
//      David Nash
 | 
						|
//      email: dnash@bigpond.net.au
 | 
						|
//      url: https://sourceforge.net/projects/win32-framework
 | 
						|
//
 | 
						|
//
 | 
						|
// Copyright (c) 2005-2011  David Nash
 | 
						|
//
 | 
						|
// Permission is hereby granted, free of charge, to
 | 
						|
// any person obtaining a copy of this software and
 | 
						|
// associated documentation files (the "Software"),
 | 
						|
// to deal in the Software without restriction, including
 | 
						|
// without limitation the rights to use, copy, modify,
 | 
						|
// merge, publish, distribute, sublicense, and/or sell
 | 
						|
// copies of the Software, and to permit persons to whom
 | 
						|
// the Software is furnished to do so, subject to the
 | 
						|
// following conditions:
 | 
						|
//
 | 
						|
// The above copyright notice and this permission notice
 | 
						|
// shall be included in all copies or substantial portions
 | 
						|
// of the Software.
 | 
						|
//
 | 
						|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
 | 
						|
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 | 
						|
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 | 
						|
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
 | 
						|
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
 | 
						|
// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | 
						|
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
 | 
						|
// OR OTHER DEALINGS IN THE SOFTWARE.
 | 
						|
//
 | 
						|
////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WIN32XX_WEBBROWSER_H_
 | 
						|
#define _WIN32XX_WEBBROWSER_H_
 | 
						|
 | 
						|
#include <exdisp.h>
 | 
						|
#include <ocidl.h>
 | 
						|
 | 
						|
 | 
						|
namespace Win32xx
 | 
						|
{
 | 
						|
	///////////////////////////////////////////////////
 | 
						|
	// Declaration of the CAXWindow class
 | 
						|
	// This class implements an ActiveX control container
 | 
						|
	class CAXWindow : public IOleClientSite, public IOleInPlaceSite, public IOleInPlaceFrame,
 | 
						|
							public IOleControlSite, public IDispatch
 | 
						|
	{
 | 
						|
	public:
 | 
						|
		CAXWindow();
 | 
						|
		virtual ~CAXWindow();
 | 
						|
		virtual void Activate(BOOL fFocus);
 | 
						|
		virtual void CreateControl(BSTR bstrClsid);
 | 
						|
		virtual void CreateControl(CLSID clsid);
 | 
						|
		virtual void Remove();
 | 
						|
		virtual void SetParent(HWND hWndParent);
 | 
						|
		virtual void SetLocation(int x, int y, int width, int height);
 | 
						|
		virtual void SetVisible(BOOL fVisible);
 | 
						|
		virtual void SetStatusWindow(HWND hWndStatus);
 | 
						|
		virtual void TranslateKey(MSG msg);
 | 
						|
		IDispatch* GetDispatch();
 | 
						|
		IUnknown* GetUnknown();
 | 
						|
 | 
						|
		// IUnknown Methods
 | 
						|
		STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject);
 | 
						|
		STDMETHODIMP_(ULONG) AddRef();
 | 
						|
		STDMETHODIMP_(ULONG) Release();
 | 
						|
 | 
						|
		// IOleClientSite Methods
 | 
						|
		STDMETHODIMP SaveObject();
 | 
						|
		STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER* ppMk);
 | 
						|
		STDMETHODIMP GetContainer(LPOLECONTAINER* ppContainer);
 | 
						|
		STDMETHODIMP ShowObject();
 | 
						|
		STDMETHODIMP OnShowWindow(BOOL fShow);
 | 
						|
		STDMETHODIMP RequestNewObjectLayout();
 | 
						|
 | 
						|
		// IOleWindow Methods
 | 
						|
		STDMETHODIMP GetWindow(HWND* phwnd);
 | 
						|
		STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
 | 
						|
 | 
						|
		// IOleInPlaceSite Methods
 | 
						|
		STDMETHODIMP CanInPlaceActivate();
 | 
						|
		STDMETHODIMP OnInPlaceActivate();
 | 
						|
		STDMETHODIMP OnUIActivate();
 | 
						|
		STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
 | 
						|
		STDMETHODIMP Scroll(SIZE scrollExtent);
 | 
						|
		STDMETHODIMP OnUIDeactivate(BOOL fUndoable);
 | 
						|
		STDMETHODIMP OnInPlaceDeactivate();
 | 
						|
		STDMETHODIMP DiscardUndoState();
 | 
						|
		STDMETHODIMP DeactivateAndUndo();
 | 
						|
		STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect);
 | 
						|
 | 
						|
		// IOleInPlaceUIWindow Methods
 | 
						|
		STDMETHODIMP GetBorder(LPRECT lprectBorder);
 | 
						|
		STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS lpborderwidths);
 | 
						|
		STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS lpborderwidths);
 | 
						|
		STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR lpszObjName);
 | 
						|
 | 
						|
		// IOleInPlaceFrame Methods
 | 
						|
		STDMETHODIMP InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
 | 
						|
		STDMETHODIMP SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
 | 
						|
		STDMETHODIMP RemoveMenus(HMENU hmenuShared);
 | 
						|
		STDMETHODIMP SetStatusText(LPCOLESTR pszStatusText);
 | 
						|
		STDMETHODIMP EnableModeless(BOOL fEnable);
 | 
						|
		STDMETHODIMP TranslateAccelerator(LPMSG lpmsg, WORD wID);
 | 
						|
 | 
						|
		// IOleControlSite Methods
 | 
						|
		STDMETHODIMP OnControlInfoChanged();
 | 
						|
		STDMETHODIMP LockInPlaceActive(BOOL fLock);
 | 
						|
		STDMETHODIMP GetExtendedControl(IDispatch** ppDisp);
 | 
						|
		STDMETHODIMP TransformCoords(POINTL* pptlHimetric, POINTF* pptfContainer, DWORD dwFlags);
 | 
						|
		STDMETHODIMP TranslateAccelerator(LPMSG pMsg, DWORD grfModifiers);
 | 
						|
		STDMETHODIMP OnFocus(BOOL fGotFocus);
 | 
						|
		STDMETHODIMP ShowPropertyFrame();
 | 
						|
 | 
						|
		// IDispatch Methods
 | 
						|
		STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, unsigned int cNames, LCID lcid, DISPID* rgdispid);
 | 
						|
		STDMETHODIMP GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo** pptinfo);
 | 
						|
		STDMETHODIMP GetTypeInfoCount(unsigned int* pctinfo);
 | 
						|
		STDMETHODIMP Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexecinfo, unsigned int* puArgErr);
 | 
						|
 | 
						|
	private:
 | 
						|
		 ULONG       m_cRefs;       // ref count
 | 
						|
		 HWND        m_hWnd;        // window handle of the container
 | 
						|
		 HWND        m_hWndStatus;  // status window handle
 | 
						|
		 IUnknown*   m_pUnk;		// IUnknown of contained object
 | 
						|
		 CRect       m_rcControl;	// size of control
 | 
						|
	};
 | 
						|
 | 
						|
 | 
						|
	///////////////////////////////////////////////
 | 
						|
	// Declaration of the CWebBrowser class
 | 
						|
	// This class uses an AciveX Container provided by
 | 
						|
	// CAXWindow to host the IWebBrower2 interface.
 | 
						|
	class CWebBrowser : public CWnd
 | 
						|
	{
 | 
						|
	public:
 | 
						|
		CWebBrowser();
 | 
						|
		virtual ~CWebBrowser();
 | 
						|
		virtual void AddWebBrowserControl(void);
 | 
						|
		virtual CAXWindow& GetAXWindow() const { return (CAXWindow&)m_AXContainer; }
 | 
						|
		virtual IWebBrowser2* GetIWebBrowser2() const { return m_pIWebBrowser2; }
 | 
						|
		virtual void Navigate(LPCTSTR str);
 | 
						|
 | 
						|
	protected:
 | 
						|
		virtual void OnCreate();
 | 
						|
		virtual void OnSize(int width, int height);
 | 
						|
		virtual LRESULT WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam);
 | 
						|
 | 
						|
	private:
 | 
						|
		CAXWindow	m_AXContainer;		// The ActiveX Container
 | 
						|
		IWebBrowser2*	m_pIWebBrowser2;// Interface to the ActiveX web browser control
 | 
						|
	};
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
namespace Win32xx
 | 
						|
{
 | 
						|
	/////////////////////////////////////////
 | 
						|
	// Definitions for the CAXWindow class
 | 
						|
	//
 | 
						|
	inline CAXWindow::CAXWindow() : m_cRefs(1), m_hWnd(NULL), m_pUnk(NULL)
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	inline CAXWindow::~CAXWindow()
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::CreateControl(BSTR bstrClsid)
 | 
						|
	{
 | 
						|
		CLSID   clsid;
 | 
						|
		CLSIDFromString(bstrClsid, &clsid);
 | 
						|
		CreateControl(clsid);
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::Activate(BOOL fFocus)
 | 
						|
	{
 | 
						|
		if (!m_pUnk)
 | 
						|
			return;
 | 
						|
 | 
						|
		if (fFocus)
 | 
						|
		{
 | 
						|
			IOleObject* pioo;
 | 
						|
	 		HRESULT hr = m_pUnk->QueryInterface(IID_IOleObject, (void**)&pioo);
 | 
						|
	 		if (FAILED(hr))
 | 
						|
	 			return;
 | 
						|
 | 
						|
	 		pioo->DoVerb(OLEIVERB_UIACTIVATE, NULL, this, 0, m_hWnd, &m_rcControl);
 | 
						|
	 		pioo->Release();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::CreateControl(CLSID clsid)
 | 
						|
	{
 | 
						|
		CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&m_pUnk);
 | 
						|
 | 
						|
		if (!m_pUnk)
 | 
						|
			return;
 | 
						|
 | 
						|
		IOleObject* pioo;
 | 
						|
		HRESULT hr = m_pUnk->QueryInterface(IID_IOleObject, (void**)&pioo);
 | 
						|
		if (FAILED(hr))
 | 
						|
			return;
 | 
						|
 | 
						|
		pioo->SetClientSite(this);
 | 
						|
		pioo->Release();
 | 
						|
 | 
						|
		IPersistStreamInit* ppsi;
 | 
						|
		hr = m_pUnk->QueryInterface(IID_IPersistStreamInit, (void**)&ppsi);
 | 
						|
		if (SUCCEEDED(hr))
 | 
						|
		{
 | 
						|
			ppsi->InitNew();
 | 
						|
			ppsi->Release();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP_(ULONG) CAXWindow::AddRef()
 | 
						|
	{
 | 
						|
		return ++m_cRefs;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::CanInPlaceActivate()
 | 
						|
	{
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::ContextSensitiveHelp(BOOL fEnterMode)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(fEnterMode);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::DeactivateAndUndo()
 | 
						|
	{
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::DiscardUndoState()
 | 
						|
	{
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::EnableModeless(BOOL fEnable)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(fEnable);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetBorder(LPRECT lprectBorder)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(lprectBorder);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetContainer(LPOLECONTAINER* ppContainer)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(ppContainer);
 | 
						|
		return E_NOINTERFACE;
 | 
						|
	}
 | 
						|
 | 
						|
	inline IDispatch* CAXWindow::GetDispatch()
 | 
						|
	{
 | 
						|
		if (!m_pUnk)
 | 
						|
			return NULL;
 | 
						|
 | 
						|
		HRESULT     hr;
 | 
						|
		IDispatch*  pdisp;
 | 
						|
 | 
						|
		hr = m_pUnk->QueryInterface(IID_IDispatch, (void**)&pdisp);
 | 
						|
		return pdisp;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetExtendedControl(IDispatch** ppDisp)
 | 
						|
	{
 | 
						|
		if (ppDisp == NULL)
 | 
						|
			return E_INVALIDARG;
 | 
						|
 | 
						|
		*ppDisp = (IDispatch*)this;
 | 
						|
		(*ppDisp)->AddRef();
 | 
						|
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, unsigned int cNames, LCID lcid, DISPID* rgdispid)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER((IID)riid);		// IID cast required for the MinGW compiler
 | 
						|
		UNREFERENCED_PARAMETER(rgszNames);
 | 
						|
		UNREFERENCED_PARAMETER(cNames);
 | 
						|
		UNREFERENCED_PARAMETER(lcid);
 | 
						|
 | 
						|
		*rgdispid = DISPID_UNKNOWN;
 | 
						|
		return DISP_E_UNKNOWNNAME;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER* ppMk)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(dwAssign);
 | 
						|
		UNREFERENCED_PARAMETER(dwWhichMoniker);
 | 
						|
		UNREFERENCED_PARAMETER(ppMk);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo** pptinfo)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(itinfo);
 | 
						|
		UNREFERENCED_PARAMETER(lcid);
 | 
						|
		UNREFERENCED_PARAMETER(pptinfo);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetTypeInfoCount(unsigned int* pctinfo)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(pctinfo);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline IUnknown* CAXWindow::GetUnknown()
 | 
						|
	{
 | 
						|
		if (!m_pUnk)
 | 
						|
			return NULL;
 | 
						|
 | 
						|
		m_pUnk->AddRef();
 | 
						|
		return m_pUnk;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetWindow(HWND* lphwnd)
 | 
						|
	{
 | 
						|
		if (!IsWindow(m_hWnd))
 | 
						|
			return S_FALSE;
 | 
						|
 | 
						|
		*lphwnd = m_hWnd;
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::GetWindowContext (IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppIIPUIWin,
 | 
						|
									  LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
 | 
						|
	{
 | 
						|
		*ppFrame = (IOleInPlaceFrame*)this;
 | 
						|
		*ppIIPUIWin = NULL;
 | 
						|
 | 
						|
		RECT rect;
 | 
						|
		GetClientRect(m_hWnd, &rect);
 | 
						|
		lprcPosRect->left       = 0;
 | 
						|
		lprcPosRect->top        = 0;
 | 
						|
		lprcPosRect->right      = rect.right;
 | 
						|
		lprcPosRect->bottom     = rect.bottom;
 | 
						|
 | 
						|
		CopyRect(lprcClipRect, lprcPosRect);
 | 
						|
 | 
						|
		lpFrameInfo->cb             = sizeof(OLEINPLACEFRAMEINFO);
 | 
						|
		lpFrameInfo->fMDIApp        = FALSE;
 | 
						|
		lpFrameInfo->hwndFrame      = m_hWnd;
 | 
						|
		lpFrameInfo->haccel         = 0;
 | 
						|
		lpFrameInfo->cAccelEntries  = 0;
 | 
						|
 | 
						|
		(*ppFrame)->AddRef();
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(hmenuShared);
 | 
						|
		UNREFERENCED_PARAMETER(lpMenuWidths);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexecinfo, unsigned int* puArgErr)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(dispid);
 | 
						|
		UNREFERENCED_PARAMETER((IID)riid);		// IID cast required for the MinGW compiler
 | 
						|
		UNREFERENCED_PARAMETER(lcid);
 | 
						|
		UNREFERENCED_PARAMETER(wFlags);
 | 
						|
		UNREFERENCED_PARAMETER(pdispparams);
 | 
						|
		UNREFERENCED_PARAMETER(pvarResult);
 | 
						|
		UNREFERENCED_PARAMETER(pexecinfo);
 | 
						|
		UNREFERENCED_PARAMETER(puArgErr);
 | 
						|
		return DISP_E_MEMBERNOTFOUND;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::LockInPlaceActive(BOOL fLock)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(fLock);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnControlInfoChanged()
 | 
						|
	{
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnFocus(BOOL fGotFocus)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(fGotFocus);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnInPlaceActivate()
 | 
						|
	{
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnInPlaceDeactivate()
 | 
						|
	{
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnPosRectChange(LPCRECT lprcPosRect)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(lprcPosRect);
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnShowWindow(BOOL fShow)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(fShow);
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnUIActivate()
 | 
						|
	{
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::OnUIDeactivate(BOOL fUndoable)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(fUndoable);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::QueryInterface(REFIID riid, void** ppvObject)
 | 
						|
	{
 | 
						|
		if (!ppvObject)
 | 
						|
			return E_POINTER;
 | 
						|
 | 
						|
		if (IsEqualIID(riid, IID_IOleClientSite))
 | 
						|
			*ppvObject = (IOleClientSite*)this;
 | 
						|
		else if (IsEqualIID(riid, IID_IOleInPlaceSite))
 | 
						|
			*ppvObject = (IOleInPlaceSite*)this;
 | 
						|
		else if (IsEqualIID(riid, IID_IOleInPlaceFrame))
 | 
						|
			*ppvObject = (IOleInPlaceFrame*)this;
 | 
						|
		else if (IsEqualIID(riid, IID_IOleInPlaceUIWindow))
 | 
						|
			*ppvObject = (IOleInPlaceUIWindow*)this;
 | 
						|
		else if (IsEqualIID(riid, IID_IOleControlSite))
 | 
						|
			*ppvObject = (IOleControlSite*)this;
 | 
						|
		else if (IsEqualIID(riid, IID_IOleWindow))
 | 
						|
			*ppvObject = this;
 | 
						|
		else if (IsEqualIID(riid, IID_IDispatch))
 | 
						|
			*ppvObject = (IDispatch*)this;
 | 
						|
		else if (IsEqualIID(riid, IID_IUnknown))
 | 
						|
			*ppvObject = this;
 | 
						|
		else
 | 
						|
		{
 | 
						|
			*ppvObject = NULL;
 | 
						|
			return E_NOINTERFACE;
 | 
						|
		}
 | 
						|
 | 
						|
		AddRef();
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP_(ULONG) CAXWindow::Release()
 | 
						|
	{
 | 
						|
		return --m_cRefs;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::Remove()
 | 
						|
	{
 | 
						|
		if (!m_pUnk)
 | 
						|
			return;
 | 
						|
 | 
						|
		IOleObject* pioo;
 | 
						|
		HRESULT hr = m_pUnk->QueryInterface(IID_IOleObject, (void**)&pioo);
 | 
						|
		if (SUCCEEDED(hr))
 | 
						|
		{
 | 
						|
			pioo->Close(OLECLOSE_NOSAVE);
 | 
						|
			pioo->SetClientSite(NULL);
 | 
						|
			pioo->Release();
 | 
						|
		}
 | 
						|
 | 
						|
		IOleInPlaceObject* pipo;
 | 
						|
		hr = m_pUnk->QueryInterface(IID_IOleInPlaceObject, (void**)&pipo);
 | 
						|
		if (SUCCEEDED(hr))
 | 
						|
		{
 | 
						|
			pipo->UIDeactivate();
 | 
						|
			pipo->InPlaceDeactivate();
 | 
						|
			pipo->Release();
 | 
						|
		}
 | 
						|
 | 
						|
		m_pUnk->Release();
 | 
						|
		m_pUnk = NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::RemoveMenus(HMENU hmenuShared)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(hmenuShared);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::RequestBorderSpace(LPCBORDERWIDTHS lpborderwidths)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(lpborderwidths);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::RequestNewObjectLayout()
 | 
						|
	{
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::SaveObject()
 | 
						|
	{
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::Scroll(SIZE scrollExtent)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(scrollExtent);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::SetActiveObject(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR lpszObjName)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(pActiveObject);
 | 
						|
		UNREFERENCED_PARAMETER(lpszObjName);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::SetBorderSpace(LPCBORDERWIDTHS lpborderwidths)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(lpborderwidths);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::SetLocation(int x, int y, int width, int height)
 | 
						|
	{
 | 
						|
		m_rcControl.SetRect(x, y, x + width, y + height);
 | 
						|
 | 
						|
		if (!m_pUnk)
 | 
						|
			return;
 | 
						|
 | 
						|
		IOleInPlaceObject* pipo;
 | 
						|
		HRESULT hr = m_pUnk->QueryInterface(IID_IOleInPlaceObject, (void**)&pipo);
 | 
						|
		if (FAILED(hr))
 | 
						|
			return;
 | 
						|
 | 
						|
		pipo->SetObjectRects(&m_rcControl, &m_rcControl);
 | 
						|
		pipo->Release();
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(hmenuShared);
 | 
						|
		UNREFERENCED_PARAMETER(holemenu);
 | 
						|
		UNREFERENCED_PARAMETER(hwndActiveObject);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::SetParent(HWND hWndParent)
 | 
						|
	{
 | 
						|
		m_hWnd = hWndParent;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::SetStatusText(LPCOLESTR pszStatusText)
 | 
						|
	{
 | 
						|
		if (NULL == pszStatusText)
 | 
						|
			return E_POINTER;
 | 
						|
 | 
						|
	#ifndef _UNICODE
 | 
						|
		char status[MAX_PATH];
 | 
						|
		// Convert the Wide string to char
 | 
						|
		WideCharToMultiByte(CP_ACP, 0, pszStatusText, -1, status, MAX_PATH, NULL, NULL);
 | 
						|
 | 
						|
		if (IsWindow(m_hWndStatus))
 | 
						|
			SendMessage(m_hWndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)status);
 | 
						|
	#else
 | 
						|
		if (IsWindow(m_hWndStatus))
 | 
						|
			SendMessage(m_hWndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)pszStatusText);
 | 
						|
	#endif
 | 
						|
 | 
						|
		return (S_OK);
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::SetStatusWindow(HWND hWndStatus)
 | 
						|
	{
 | 
						|
		m_hWndStatus = hWndStatus;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::SetVisible(BOOL fVisible)
 | 
						|
	{
 | 
						|
		if (!m_pUnk)
 | 
						|
			return;
 | 
						|
 | 
						|
		IOleObject* pioo;
 | 
						|
		HRESULT hr = m_pUnk->QueryInterface(IID_IOleObject, (void**)&pioo);
 | 
						|
		if (FAILED(hr))
 | 
						|
			return;
 | 
						|
 | 
						|
		if (fVisible)
 | 
						|
		{
 | 
						|
			pioo->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, this, 0, m_hWnd, &m_rcControl);
 | 
						|
			pioo->DoVerb(OLEIVERB_SHOW, NULL, this, 0, m_hWnd, &m_rcControl);
 | 
						|
		}
 | 
						|
		else
 | 
						|
			pioo->DoVerb(OLEIVERB_HIDE, NULL, this, 0, m_hWnd, NULL);
 | 
						|
 | 
						|
		pioo->Release();
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::ShowObject()
 | 
						|
	{
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::ShowPropertyFrame()
 | 
						|
	{
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::TransformCoords(POINTL* pptlHimetric, POINTF* pptfContainer, DWORD dwFlags)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(pptlHimetric);
 | 
						|
		UNREFERENCED_PARAMETER(pptfContainer);
 | 
						|
		UNREFERENCED_PARAMETER(dwFlags);
 | 
						|
		return E_NOTIMPL;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::TranslateAccelerator(LPMSG lpmsg, WORD wID)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(lpmsg);
 | 
						|
		UNREFERENCED_PARAMETER(wID);
 | 
						|
		return S_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	inline STDMETHODIMP CAXWindow::TranslateAccelerator(LPMSG pMsg, DWORD grfModifiers)
 | 
						|
	{
 | 
						|
		UNREFERENCED_PARAMETER(pMsg);
 | 
						|
		UNREFERENCED_PARAMETER(grfModifiers);
 | 
						|
		return S_FALSE;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CAXWindow::TranslateKey(MSG msg)
 | 
						|
	{
 | 
						|
		if (!m_pUnk)
 | 
						|
			return;
 | 
						|
 | 
						|
		IOleInPlaceActiveObject* pao;
 | 
						|
		HRESULT hr = m_pUnk->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&pao);
 | 
						|
		if (FAILED(hr))
 | 
						|
			return;
 | 
						|
 | 
						|
		pao->TranslateAccelerator(&msg);
 | 
						|
		pao->Release();
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	////////////////////////////////////////
 | 
						|
	// Definitions for the CWebBrowser class
 | 
						|
	//
 | 
						|
	inline CWebBrowser::CWebBrowser() : m_pIWebBrowser2(0)
 | 
						|
	{
 | 
						|
		OleInitialize(NULL);
 | 
						|
	}
 | 
						|
 | 
						|
	inline CWebBrowser::~CWebBrowser()
 | 
						|
	{
 | 
						|
		if (m_pIWebBrowser2)
 | 
						|
		{
 | 
						|
			m_pIWebBrowser2->Stop();
 | 
						|
			m_pIWebBrowser2->Release();
 | 
						|
		}
 | 
						|
 | 
						|
		OleUninitialize();
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CWebBrowser::AddWebBrowserControl()
 | 
						|
	{
 | 
						|
		GetAXWindow().CreateControl(CLSID_WebBrowser);
 | 
						|
		GetAXWindow().SetParent(m_hWnd);
 | 
						|
		GetAXWindow().SetVisible(TRUE);
 | 
						|
		GetAXWindow().Activate(TRUE);
 | 
						|
 | 
						|
		IUnknown* pUnk = GetAXWindow().GetUnknown();
 | 
						|
		if(pUnk)
 | 
						|
		{
 | 
						|
			// Store the pointer to the WebBrowser control
 | 
						|
			HRESULT hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&m_pIWebBrowser2);
 | 
						|
			pUnk->Release();
 | 
						|
 | 
						|
			// Navigate to an empty page
 | 
						|
			if (SUCCEEDED(hr))
 | 
						|
			{
 | 
						|
				VARIANT vURL;
 | 
						|
				vURL.vt = VT_BSTR;
 | 
						|
				vURL.bstrVal = SysAllocString(L"about:blank");
 | 
						|
				VARIANT ve1, ve2, ve3, ve4;
 | 
						|
				ve1.vt = VT_EMPTY;
 | 
						|
				ve2.vt = VT_EMPTY;
 | 
						|
				ve3.vt = VT_EMPTY;
 | 
						|
				ve4.vt = VT_EMPTY;
 | 
						|
 | 
						|
				m_pIWebBrowser2->Navigate2(&vURL, &ve1, &ve2, &ve3, &ve4);
 | 
						|
 | 
						|
				VariantClear(&vURL);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CWebBrowser::Navigate(LPCTSTR pTChar)
 | 
						|
	{
 | 
						|
		// Navigate to our web page
 | 
						|
		VARIANT vURL;
 | 
						|
		vURL.vt = VT_BSTR;
 | 
						|
		vURL.bstrVal = SysAllocString(T2W(pTChar));
 | 
						|
		VARIANT ve1, ve2, ve3, ve4;
 | 
						|
		ve1.vt = VT_EMPTY;
 | 
						|
		ve2.vt = VT_EMPTY;
 | 
						|
		ve3.vt = VT_EMPTY;
 | 
						|
		ve4.vt = VT_EMPTY;
 | 
						|
 | 
						|
		GetIWebBrowser2()->Navigate2(&vURL, &ve1, &ve2, &ve3, &ve4);
 | 
						|
 | 
						|
		VariantClear(&vURL);	// Also frees memory allocated by SysAllocateString
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CWebBrowser::OnCreate()
 | 
						|
	{
 | 
						|
		AddWebBrowserControl();
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CWebBrowser::OnSize(int width, int height)
 | 
						|
	{
 | 
						|
		// position the container
 | 
						|
		GetAXWindow().SetLocation(0, 0, width, height);
 | 
						|
	}
 | 
						|
 | 
						|
	inline LRESULT CWebBrowser::WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam)
 | 
						|
	{
 | 
						|
		switch(uMsg)
 | 
						|
		{
 | 
						|
		case WM_SIZE:
 | 
						|
			OnSize(LOWORD(lParam), HIWORD(lParam));
 | 
						|
			break;
 | 
						|
		case WM_DESTROY:
 | 
						|
			GetAXWindow().Remove();
 | 
						|
			break;
 | 
						|
		}
 | 
						|
 | 
						|
		return CWnd::WndProcDefault(uMsg, wParam, lParam);
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#endif  // _WIN32XX_WEBBROWSER_H_
 | 
						|
 |