brielwcontrol.h

来自「java调用ie浏览器demo源码,可以用在windows或者linux」· C头文件 代码 · 共 358 行

H
358
字号
//////////////////////////////////
// Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. Use is
// subject to license terms.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the Lesser GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
#ifndef _BrIELWControl_H_
#define _BrIELWControl_H_

#include "stdafx.h"
#include <comutil.h>
#include <oledlg.h>
#include <mshtml.h>
#include <mshtmdid.h>
#include <exdisp.h>
#include <exdispid.h>
#include <activscp.h>
#include <comdef.h>
#include <comdefsp.h>
#include <math.h>

//#include "awt_DCHolder.h"
struct CDCHolder
{
    HDC m_hMemoryDC;
    int m_iWidth;
    int m_iHeight;
    BOOL m_bForImage;
    HBITMAP m_hBitmap;
    HBITMAP m_hAlphaBitmap;
    HBITMAP m_hOldBitmap;
    void *m_pPoints;

    CDCHolder();
    ~CDCHolder();

    void CreateAlphaImageIfCan();
    void Create(
        HDC hRelDC,
        int iWidth,
        int iHeght,
        BOOL bForImage);
    
    operator HDC()
    {
        if( NULL==m_hOldBitmap &&  NULL!=m_hBitmap ){
            m_hOldBitmap = (HBITMAP)::SelectObject(m_hMemoryDC, m_hBitmap);
        } 
        return m_hMemoryDC;
    }

    operator HBITMAP()
    {
        if(m_hAlphaBitmap)
            return m_hAlphaBitmap;
        if( NULL!=m_hOldBitmap ){
            m_hBitmap = (HBITMAP)::SelectObject(m_hMemoryDC, m_hOldBitmap);
            m_hOldBitmap = NULL;
        } 
        return m_hBitmap;
    }

    static HBITMAP CreateJavaContextBitmap(
        HDC hdc,
        int iWidth,
        int iHeight,
        void **ppPoints);
};

#define _AWT_OLE_EX_
#include "awt_ole.h"

_COM_SMARTPTR_TYPEDEF(IWebBrowser2, __uuidof(IWebBrowser2));

#define WM_POST_REDRAW (WM_USER + 0x500)

class CBrIELWControl :
    public IOleClientSite,
    public IOleInPlaceSite,
    public IAdviseSink,
    public DWebBrowserEvents2
{
public:
    IWebBrowser2Ptr                 m_spIWebBrowser2;
    COLECrossMarshal<IWebBrowser2>  m_ccIWebBrowser2;
    enum E_PAINT {
        PAINT_JAVA = 0x0001,
        PAINT_JAVA_NATIVE = 0x0002,
        PAINT_NATIVE = 0x0004,
    }; 
    int m_ePaintAlgorithm;

protected:
    HWND m_hwndParent;
    HWND m_hwndIE;
    HWND m_hwndFrame;
    HWND m_hwndShell;
    RECT m_rcIE2;//rectangle of IE in parent coordinates
    CDCHolder m_shScreen;
    void UpdateWindowRect();

public:
    //getters
    HWND GetIEWnd() { return m_hwndIE; }
    HWND GetTopWnd() { return m_hwndShell; }
    HWND GetParent() { return m_hwndParent; }

private:
    volatile LONG m_cRef;
    LONG m_cSkipDraw;
    DWORD m_dwAdvised;
    DWORD m_dwWebCPCookie;
    LONG_PTR m_pOldIEWndProc;
    static LPCTSTR ms_lpPN;
    ULONG m_tidUpdate;
protected:
    boolean m_bTransparent;



public:
    CBrIELWControl();
    ULONG Terminate(); // Disconnect and release
    void LaizyUpdate(DWORD dwDelayInMs = 10);

private:
    HRESULT InplaceActivate(BOOL bActivate = FALSE);
    HRESULT AdviseBrowser(IN BOOL bAdvise);

    BOOL IsSmoothScroll();
    static LRESULT CALLBACK NewIEProcStub(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

    void RemoveHook(HWND hWnd);
    void AddHook();


public:
    HRESULT DestroyControl();
    HRESULT Connect(IN BSTR bsURL);
    HRESULT CreateControl(
        IN HWND     hParent,
        IN LPCRECT  prcIE,
        IN BSTR     bsURL = NULL);
    HRESULT OnPaint(HDC hdcPaint, LPCRECT prcClipParent);
    virtual void RedrawInParent();
    virtual void RedrawParentRect(LPRECT pRect);
    virtual LRESULT NewIEProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    virtual void updateTransparentMask(LPRECT prc);
    virtual HRESULT SendIEEvent(
        int iId,
        LPTSTR lpName,
        LPTSTR lpValue,
        _bstr_t &bsResult = _bstr_t() );
    void PaintScreenShort();
public:
//IUnknown
    STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject)
    {
        *ppvObject = NULL;
        if( IsEqualGUID(riid, IID_IUnknown)  || IsEqualGUID(riid, IID_IOleClientSite) ){
           *ppvObject = (IOleClientSite *)this;
        } else if( IsEqualGUID(riid, IID_IOleWindow) || IsEqualGUID(riid, IID_IOleInPlaceSite) ){
           *ppvObject = (IOleInPlaceSite *)this;
        } else if(IsEqualGUID(riid, IID_IAdviseSink)){
           *ppvObject = (IAdviseSink *)this;
        } else if(IsEqualGUID(riid, IID_IDispatch)){
           *ppvObject = (IDispatch *)this;
        } else
            return E_NOTIMPL;
            //DWebBrowserEvents2 with 34A715A0-6587-11D0-924A-0020AFC7AC4D
            //can be implemented
        AddRef();
        return S_OK;
    }
    STDMETHOD_(ULONG, AddRef)()
    {
        return InterlockedIncrement(&m_cRef);
    }
    STDMETHOD_(ULONG, Release)()
    {
        LONG cRef = InterlockedDecrement(&m_cRef);
        if(0==cRef)
                delete this;
        return cRef;
    }

private:
// IOleClientSite
    STDMETHOD(SaveObject)()
    {
        OLE_TRACENOTIMPL(_T("IOleClientSite::SaveObject"))
    }
    STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
    {
        OLE_TRACENOTIMPL(_T("IOleClientSite::GetMoniker"))
    }
    STDMETHOD(GetContainer)(IOleContainer **ppContainer)
    {
        OLE_TRACENOTIMPL(_T("IOleClientSite::GetContainer"))
    }
    STDMETHOD(ShowObject)(){
        OLE_TRACENOTIMPL(_T("IOleClientSite::ShowObject"));
    }
    STDMETHOD(OnShowWindow)(BOOL fShow)
    {
        OLE_TRACENOTIMPL(_T("IOleClientSite::OnShowWindow"));
    }
    STDMETHOD(RequestNewObjectLayout)()
    {
        OLE_TRACENOTIMPL(_T("IOleClientSite::RequestNewObjectLayout"));
    }


// IOleWindow
    STDMETHOD(GetWindow)(HWND *phwnd)
    {
        *phwnd = m_hwndParent;
        return S_OK;
    }
    STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode)
    {
        OLE_TRACENOTIMPL(_T("IOleWindow::CanInPlaceActivate"));
    }

// IOleInPlaceSite
    STDMETHOD(CanInPlaceActivate)()
    {
        return S_OK;
    }
    STDMETHOD(OnInPlaceActivate)()
    {
        return S_OK;
    }
    STDMETHOD(OnUIActivate)()
    {
        OLE_TRACEOK(_T("IOleInPlaceSite::OnUIActivate"));
    }
    STDMETHOD(GetWindowContext)(
        IOleInPlaceFrame **ppFrame,
        IOleInPlaceUIWindow **ppDoc,
        LPRECT lprcPosRect,
        LPRECT lprcClipRect,
        LPOLEINPLACEFRAMEINFO lpFrameInfo)
    {
        STRACE0(_T("IOleInPlaceSite::GetWindowContext"));
        *lprcPosRect = m_rcIE2;
        *lprcClipRect = m_rcIE2;
        if(NULL!=lpFrameInfo){
            lpFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO);
            lpFrameInfo->fMDIApp = FALSE;
            lpFrameInfo->hwndFrame = m_hwndParent;
        }
        return S_OK;
    }
    STDMETHOD(Scroll)(SIZE scrollExtant)
    {
        OLE_TRACENOTIMPL(_T("IOleInPlaceSite::Scroll"));
    }
    STDMETHOD(OnUIDeactivate)(BOOL fUndoable)
    {
        OLE_TRACEOK(_T("IOleInPlaceSite::OnUIDeactivate"));
    }
    STDMETHOD(OnInPlaceDeactivate)( void)
    {
        return S_OK;
    }
    STDMETHOD(DiscardUndoState)( void)
    {
        OLE_TRACENOTIMPL(_T("IOleInPlaceSite::DiscardUndoState"));
    }
    STDMETHOD(DeactivateAndUndo)( void)
    {
        OLE_TRACENOTIMPL(_T("IOleInPlaceSite::DeactivateAndUndo"));
    }
    STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect)
    {
        OLE_TRACENOTIMPL(_T("IOleInPlaceSite::OnPosRectChange"));
    }

//IAdviseSink
    virtual void STDMETHODCALLTYPE OnDataChange(
        FORMATETC *pFormatetc,
        STGMEDIUM *pStgmed)
    {
        STRACE0(_T("IAdviseSink::OnDataChange"));
    }

    virtual void STDMETHODCALLTYPE OnViewChange(
        IN DWORD dwAspect,
        IN LONG lindex)
    {
        STRACE0(_T("IAdviseSink::OnDataChange"));
        LaizyUpdate();
    }

    virtual void STDMETHODCALLTYPE OnRename(
        IN IMoniker *pmk)
    {
        STRACE0(_T("IAdviseSink::OnRename"));
    }

    virtual void STDMETHODCALLTYPE OnSave()
    {
        STRACE0(_T("IAdviseSink::OnSave"));
    }

    virtual void STDMETHODCALLTYPE OnClose()
    {
        STRACE0(_T("IAdviseSink::OnClose"));
    }

// IDispatch
    STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(GetTypeInfo)(
            UINT iTInfo,
            LCID lcid,
            ITypeInfo** ppTInfo)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(GetIDsOfNames)(
            REFIID riid,
            LPOLESTR* rgszNames,
            UINT cNames,
            LCID lcid,
            DISPID* rgDispId)
    {
        return E_NOTIMPL;
    }

    STDMETHOD(Invoke)(
            DISPID dispIdMember,
            REFIID riid,
            LCID lcid,
            WORD wFlags,
            DISPPARAMS  *pDispParams,
            VARIANT  *pVarResult,
            EXCEPINFO  *pExcepInfo,
            UINT  *puArgErr
    );
};
#endif //_BrIELWControl_H_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?