brielwcontrol.cpp

来自「java调用ie浏览器demo源码,可以用在windows或者linux」· C++ 代码 · 共 961 行 · 第 1/3 页

CPP
961
字号
//////////////////////////////////
// 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.
#include "stdafx.h" 
#include <vector>
#include "BrIELWControl.h"       // main symbols
IMPLEMENT_SECURITY();

bool IsShiftKeyDown() { return GetKeyState(VK_SHIFT) < 0; }
bool IsAltKeyDown() { return GetKeyState(VK_MENU) < 0; }
bool IsCtrlKeyDown() { return GetKeyState(VK_CONTROL) < 0; }

RECT g_emptyRect = {0};

LPCTSTR CBrIELWControl::ms_lpPN = _T("awt_hook");
#define TID_LAIZYUPDATE 1234
CBrIELWControl::CBrIELWControl()
{
    m_cRef = 1L;
    m_cSkipDraw = 0L;
    m_hwndParent = NULL;
    m_hwndIE = NULL;
    m_hwndFrame = NULL;
    m_hwndShell = NULL;

    m_pOldIEWndProc = NULL;

    m_rcIE2.left = 0;
    m_rcIE2.top = 0;
    m_rcIE2.right = 100;
    m_rcIE2.top = 100;

    m_dwAdvised = OLE_BAD_COOKIE;
    m_dwWebCPCookie = OLE_BAD_COOKIE;

    m_tidUpdate = 0;
    m_ePaintAlgorithm = PAINT_JAVA;
    m_bTransparent = false;
}

void CBrIELWControl::UpdateWindowRect()                       
{
    HWND hRel = m_hwndIE 
        ? m_hwndIE 
        : m_hwndShell;
    if(hRel && m_hwndParent){
        ::GetClientRect(hRel, &m_rcIE2);
        MapWindowPoints(
            hRel,
            m_hwndParent,
            (LPPOINT)&m_rcIE2,
            2);
        STRACE0(_T("UpdateWindowRect x:%d y:%d w:%d h:%d"),
            m_rcIE2.left,
            m_rcIE2.top,
            m_rcIE2.right - m_rcIE2.left,
            m_rcIE2.bottom - m_rcIE2.top
        );
    }
}

ULONG CBrIELWControl::Terminate() { 
    if(m_spIWebBrowser2){
        OLE_TRY
        OLE_HRT( DestroyControl() )
        OLE_CATCH
    }
    return Release();
}   

void CBrIELWControl::LaizyUpdate(DWORD dwDelayInMs){
    if(m_hwndIE){
        if(TID_LAIZYUPDATE == m_tidUpdate)
            ::KillTimer(m_hwndIE, m_tidUpdate);
        m_tidUpdate = ::SetTimer(m_hwndIE, TID_LAIZYUPDATE, dwDelayInMs, NULL);
    }
} 

HRESULT CBrIELWControl::InplaceActivate(BOOL bActivate)
{
    OLE_TRY                                    
    IOleObjectPtr spOleObject(m_spIWebBrowser2);
    OLE_CHECK_NOTNULLSP(spOleObject)

    if(!bActivate){
        OLE_HRT( spOleObject->Close(OLECLOSE_NOSAVE) )
    }
    OLE_HRT( spOleObject->SetClientSite( bActivate ? (IOleClientSite *)this : NULL ) )
    if( bActivate ){
        OLE_HRT( spOleObject->Advise((IAdviseSink *)this, &m_dwAdvised) )
    } else if(OLE_BAD_COOKIE != m_dwAdvised){
        OLE_HRT( spOleObject->Unadvise(m_dwAdvised) )
        m_dwAdvised = OLE_BAD_COOKIE;
    }

    IViewObjectPtr spViewObject(m_spIWebBrowser2);
    OLE_CHECK_NOTNULLSP(spViewObject)

    OLE_HRT( spViewObject->SetAdvise(
        DVASPECT_CONTENT,
        0,
        bActivate ? (IAdviseSink *)this : NULL))
    
    if( bActivate ){
        UpdateWindowRect();
        MSG msg; //fake param
        OLE_HRT( spOleObject->DoVerb(
            OLEIVERB_INPLACEACTIVATE, 
            &msg, 
            this, 
            0, 
            m_hwndParent, 
            &m_rcIE2))
/*
        OLE_HRT( spOleObject->DoVerb(
            OLEIVERB_HIDE, 
            &msg, 
            this, 
            0, 
            m_hwndParent, 
            &m_rcIE2))
*/
    }
    OLE_CATCH
    OLE_RETURN_HR
}

HRESULT CBrIELWControl::AdviseBrowser(IN BOOL bAdvise)
{
    OLE_TRY 
    IConnectionPointContainerPtr spConnectionPointContainer(m_spIWebBrowser2);
    OLE_CHECK_NOTNULLSP(spConnectionPointContainer)

    IConnectionPointPtr spConnectionPoint;
    OLE_HRT( spConnectionPointContainer->FindConnectionPoint(
	DIID_DWebBrowserEvents2,
	&spConnectionPoint))
    OLE_CHECK_NOTNULLSP(spConnectionPoint)

    if(bAdvise){
	OLE_HRT( spConnectionPoint->Advise((IDispatch *)this, &m_dwWebCPCookie) )
    }else{
        OLE_HRT( spConnectionPoint->Unadvise(m_dwWebCPCookie) )
        m_dwWebCPCookie = OLE_BAD_COOKIE;
    }
    OLE_CATCH
    OLE_RETURN_HR
}

void OLE_CoPump();
HRESULT CBrIELWControl::DestroyControl()
{
    if(m_hwndIE){
        RemoveHook(m_hwndIE);
    }
    m_hwndShell = NULL;

    OLE_TRY 
    OLE_HRT( InplaceActivate(FALSE) )       
    OLE_HRT( AdviseBrowser(FALSE) )
    OLE_CATCH
    m_dwAdvised = OLE_BAD_COOKIE;
    m_dwWebCPCookie = OLE_BAD_COOKIE;
    m_spIWebBrowser2 = NULL;
    m_ccIWebBrowser2 = NULL;

    OLE_CoPump();
    OLE_RETURN_HR
}

HRESULT CBrIELWControl::Connect(IN BSTR bsURL)
{
    OLE_TRY 
    static _bstr_t bsAboutBlank(L"about:blank");
    OLE_HRT( m_spIWebBrowser2->Navigate(
        bsURL ? bsURL : ((BSTR)bsAboutBlank),
        _PO, _PO, _PO, _PO))
    OLE_CATCH
    OLE_RETURN_HR
}

HRESULT CBrIELWControl::CreateControl(
    IN HWND     hParent,
    IN LPCRECT  prcIE,
    IN BSTR     bsURL)
{
    OLE_TRY 
    OLE_CHECK_NOTNULL(hParent)
    OLE_CHECK_NOTNULL(prcIE)
    m_hwndParent = hParent;
    m_rcIE2 = *prcIE;

    if(m_spIWebBrowser2){
        OLE_HRT( DestroyControl() )
    }                            

    OLE_HRT( CoCreateInstance(
        CLSID_WebBrowser, 
        NULL, 
        CLSCTX_INPROC, 
        IID_IWebBrowser2, 
        (void**)&m_spIWebBrowser2))
    OLE_CHECK_NOTNULLSP(m_spIWebBrowser2)        

    m_ccIWebBrowser2 = m_spIWebBrowser2;
    OLE_HRT( AdviseBrowser(TRUE) )
    OLE_HRT( InplaceActivate(TRUE) )       

    OLE_HRT( Connect(bsURL) )   

    IOleWindowPtr pOleWindow(m_spIWebBrowser2);
    OLE_CHECK_NOTNULLSP(pOleWindow)        
    OLE_HRT(pOleWindow->GetWindow(&m_hwndShell));

    OLE_CATCH
    OLE_RETURN_HR
}


HRESULT CBrIELWControl::OnPaint(HDC hdc, LPCRECT prcClip/*InParent*/)
{
    OLE_TRY
    const RECT &rc = *prcClip;
    IViewObjectPtr spViewObject(m_spIWebBrowser2);
    OLE_CHECK_NOTNULLSP(spViewObject)

    SEP(_T("Draw"));
    RECTL rcIE = {
        0, 0, 
        m_rcIE2.right - m_rcIE2.left, m_rcIE2.bottom - m_rcIE2.top
    };
    RECTL rcIEClip = {
        rc.left - m_rcIE2.left, rc.top - m_rcIE2.top, 
        rc.right - m_rcIE2.left, rc.bottom - m_rcIE2.top
    };

    CDCHolder shCopy;
    shCopy.Create(hdc, rcIE.right, rcIE.bottom, FALSE);
    //STRACE1(_T("shCopy.Create done"));
    ++m_cSkipDraw;
    OLE_HRT( spViewObject->Draw(
        DVASPECT_CONTENT,
        -1, 
        NULL, 
        NULL,
        NULL, 
        shCopy, 
        &rcIE, 
        &rcIEClip,
        NULL, 
        0
    ));
    --m_cSkipDraw;
    OLE_HRW32_BOOL( ::BitBlt(
        hdc, 
        rc.left,
        rc.top,
        rc.right - rc.left,
        rc.bottom - rc.top,
        shCopy,
        rcIEClip.left,
        rcIEClip.top,
        SRCCOPY ));                      
    OLE_CATCH
    OLE_RETURN_HR
}


BOOL CBrIELWControl::IsSmoothScroll()
{
    HWND hScroll = ::GetCapture();
    if(hScroll){
#define _MAX_CLASS 64
        TCHAR szClassName[_MAX_CLASS] = {0};
        hScroll = (
            _MAX_CLASS > GetClassName(
                hScroll,
                szClassName,
                _MAX_CLASS - 1
            ) 
            && 0==_tcscmp(szClassName, _T("Internet Explorer_Hidden"))
        )
            ? hScroll
            : NULL;
    }
    return (BOOL)hScroll; 
}

LRESULT CBrIELWControl::NewIEProcStub(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    CBrIELWControl *pThis = (CBrIELWControl *)::GetProp(hWnd, ms_lpPN);
    return pThis
        ? pThis->NewIEProc(hWnd, msg, wParam, lParam)
        : 0;
}                                         

void CBrIELWControl::RedrawParentRect(LPRECT pRect)
{
    InvalidateRect(m_hwndParent, pRect, FALSE);
}

void CBrIELWControl::RedrawInParent()
{
    OLE_TRY
    UpdateWindowRect();
    MSG msg; //fake param

⌨️ 快捷键说明

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