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 + -
显示快捷键?