⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrlweb.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// CtrlWeb.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Shareaza 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 Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

#include "StdAfx.h"
#include "Shareaza.h"
#include "CtrlWeb.h"

#include "CoolMenu.h"
#include "Skin.h"

#include <exdispid.h>

IMPLEMENT_DYNAMIC(CWebCtrl, CWnd)

BEGIN_INTERFACE_MAP(CWebCtrl::DocSite, COleControlSite)
	INTERFACE_PART(CWebCtrl::DocSite, IID_IDocHostUIHandler, DocHostUIHandler)
	INTERFACE_PART(CWebCtrl::DocSite, IID_IDocHostShowUI, DocHostShowUI)
	INTERFACE_PART(CWebCtrl::DocSite, IID_IServiceProvider, ServiceProvider)
	INTERFACE_PART(CWebCtrl::DocSite, IID_IInternetSecurityManager, InternetSecurityManager)
END_INTERFACE_MAP()

BEGIN_EVENTSINK_MAP(CWebCtrl, CWnd)
	ON_EVENT(CWebCtrl, AFX_IDW_PANE_FIRST, DISPID_BEFORENAVIGATE2, BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
	ON_EVENT(CWebCtrl, AFX_IDW_PANE_FIRST, DISPID_NEWWINDOW2, OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)
END_EVENTSINK_MAP()

BEGIN_MESSAGE_MAP(CWebCtrl, CWnd)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_PAINT()
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CWebCtrl construction

CWebCtrl::CWebCtrl()
{
	m_bSandbox	= FALSE;
	m_tFrame	= 0;
	m_pMenu		= NULL;
}

CWebCtrl::~CWebCtrl()
{
	if ( m_pMenu != NULL )
	{
		EnterMenu( NULL );
		delete m_pMenu;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CWebCtrl operations

BOOL CWebCtrl::Create(DWORD dwStyle, CWnd* pParentWnd, UINT nID)
{
	CRect rect( 0, 0, 0, 0 );
	return CWnd::Create( NULL, NULL, WS_CHILD|WS_CLIPCHILDREN|dwStyle,
		rect, pParentWnd, nID, NULL );
}

void CWebCtrl::EnableCoolMenu(BOOL bEnable)
{
	if ( m_pMenu != NULL )
	{
		if ( bEnable ) return;
		EnterMenu( NULL );
		delete m_pMenu;
		m_pMenu = NULL;
	}
	else
	{
		if ( ! bEnable ) return;
		m_pMenu = new CCoolMenu();
		m_pMenu->SetWatermark( Skin.GetWatermark( _T("CCoolMenu") ) );
	}
}

void CWebCtrl::EnableSandbox(BOOL bSandbox)
{
	m_bSandbox = bSandbox;
	if ( m_pBrowser != NULL ) m_pBrowser->put_Offline( m_bSandbox ? VARIANT_TRUE : VARIANT_FALSE );
}

void CWebCtrl::SetExternal(IDispatch* pDispatch)
{
	m_pExternal = pDispatch;
}

HRESULT CWebCtrl::Navigate(LPCTSTR lpszURL, DWORD dwFlags, LPCTSTR lpszTargetFrameName, LPCTSTR lpszHeaders, LPVOID lpvPostData, DWORD dwPostDataLen)
{
	if ( m_pBrowser == NULL ) return E_UNEXPECTED;
	
	CString strURL( lpszURL );
	CComBSTR bstrURL;
	bstrURL.Attach( strURL.AllocSysString() );
	
	COleSafeArray vPostData;
	if ( lpvPostData != NULL )
	{
		if ( dwPostDataLen == 0 ) dwPostDataLen = lstrlen( (LPCTSTR)lpvPostData );
		vPostData.CreateOneDim( VT_UI1, dwPostDataLen, lpvPostData );
	}
	
	return m_pBrowser->Navigate( bstrURL, COleVariant( (long) dwFlags, VT_I4 ),
        COleVariant( lpszTargetFrameName, VT_BSTR ), vPostData,
		COleVariant( lpszHeaders, VT_BSTR ) );
}

/////////////////////////////////////////////////////////////////////////////
// CWebCtrl message handlers

int CWebCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if ( CWnd::OnCreate( lpCreateStruct ) == -1 ) return -1;
	
	AfxEnableControlContainer();
	
	CRect rect;
	GetClientRect( rect );
	
	if ( m_wndBrowser.CreateControl( CLSID_WebBrowser, NULL,
		 WS_VISIBLE|WS_CHILD, rect, this, AFX_IDW_PANE_FIRST ) )
	{
		IUnknown* pUnknown = m_wndBrowser.GetControlUnknown();
		
		if ( pUnknown != NULL &&
			 SUCCEEDED( pUnknown->QueryInterface( IID_IWebBrowser2, (void**)&m_pBrowser ) ) &&
			 m_pBrowser != NULL )
		{
			if ( m_bSandbox ) m_pBrowser->put_Offline( VARIANT_TRUE );
		}
		else
		{
			m_pBrowser = NULL;
			m_wndBrowser.DestroyWindow();
		}
	}
	
	return 0;
}

void CWebCtrl::OnDestroy()
{
	EnterMenu( NULL );
	
	m_pBrowser = NULL;
	if ( m_wndBrowser.m_hWnd != NULL ) m_wndBrowser.DestroyWindow();
	
	CWnd::OnDestroy();
}

BOOL CWebCtrl::PreTranslateMessage(MSG* pMsg)
{
	if ( m_pBrowser != NULL )
	{
		CComQIPtr<IOleInPlaceActiveObject> pInPlace = m_pBrowser;
		if ( pInPlace != NULL )
			return pInPlace->TranslateAccelerator( pMsg ) == S_OK;
	}
	
	return CWnd::PreTranslateMessage( pMsg );
}

void CWebCtrl::OnSize(UINT nType, int cx, int cy)
{
	CWnd::OnSize( nType, cx, cy );
	
	if ( ::IsWindow( m_wndBrowser.m_hWnd ) )
	{
		CRect rect;
		GetClientRect( rect );
		::AdjustWindowRectEx( rect, ::GetWindowLong( m_wndBrowser, GWL_STYLE ), FALSE, WS_EX_CLIENTEDGE );
		m_wndBrowser.SetWindowPos( NULL, rect.left, rect.top,
			rect.Width(), rect.Height(), SWP_NOACTIVATE|SWP_NOZORDER );
	}
}

void CWebCtrl::OnPaint()
{
	CPaintDC dc( this );
	
	if ( ! ::IsWindow( m_wndBrowser.m_hWnd ) )
	{
		CString str = _T("Internet Explorer is required for this feature.");
		CRect rc;
		GetClientRect( &rc );
		dc.FillSolidRect( &rc, GetSysColor( COLOR_WINDOW ) );
		dc.SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) );
		dc.DrawText( str, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
	}
}

/////////////////////////////////////////////////////////////////////////////
// CWebCtrl cool menu driver

CWebCtrl* CWebCtrl::m_pThis = NULL;

void CWebCtrl::EnterMenu(POINT* pPoint)
{
	if ( m_pThis != NULL )
	{
		SetWindowLong( m_pThis->m_hWndThis, GWL_WNDPROC, (LONG)m_pThis->m_pWndProc );
		m_pThis = NULL;
	}
	
	if ( pPoint == NULL || m_pMenu == NULL ) return;
	
	CPoint ptScreen( *pPoint );
	ptScreen.Offset( 2, 2 );
	
	for ( CWnd* pChild = this ; ; )
	{
		CPoint ptClient( ptScreen );
		pChild->ScreenToClient( &ptClient );
		CWnd* pNext = pChild->ChildWindowFromPoint( ptClient, CWP_ALL );
		if ( pNext == NULL || pNext == pChild ) break;
		pChild = pNext;
	}
	
	TCHAR szClass[128];
    GetClassName( *pChild, szClass, 128 );
	if ( _tcsistr( szClass, _T("Internet Explorer") ) == NULL ) return;
	
	m_pThis = this;
	m_hWndThis = pChild->GetSafeHwnd();
	m_pWndProc = (WNDPROC)GetWindowLong( m_hWndThis, GWL_WNDPROC );
	SetWindowLong( m_hWndThis, GWL_WNDPROC, (LONG)WebWndProc );
}

LRESULT PASCAL CWebCtrl::WebWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	WNDPROC pWndProc = m_pThis->m_pWndProc;
	
	ASSERT( m_pThis->m_hWndThis == hWnd );
	
    switch ( nMsg )
	{
	case WM_DESTROY:
	case WM_EXITMENULOOP:
		SetWindowLong( hWnd, GWL_WNDPROC, (LONG)pWndProc );
		m_pThis = NULL;
		break;
	case WM_INITMENUPOPUP:
		m_pThis->m_pMenu->AddMenu( CMenu::FromHandle( (HMENU)wParam ), TRUE );
		break;
	case WM_MEASUREITEM:
		m_pThis->m_pMenu->OnMeasureItem( (LPMEASUREITEMSTRUCT)lParam );
		return 0;
	case WM_DRAWITEM:
		m_pThis->m_pMenu->OnDrawItem( (LPDRAWITEMSTRUCT)lParam );
		return 0;
	}
	
	return CallWindowProc( pWndProc, hWnd, nMsg, wParam, lParam );
}

/////////////////////////////////////////////////////////////////////////////
// CWebCtrl browser event handlers

void CWebCtrl::BeforeNavigate2(LPDISPATCH pDispatch, VARIANT* pvURL, VARIANT* pvFlags, VARIANT* pvTargetFrameName, VARIANT* pvPostData, VARIANT* pvHeaders, VARIANT_BOOL* pvCancel) 
{
	ASSERT(V_VT(pvURL) == VT_BSTR);
	ASSERT(V_VT(pvTargetFrameName) == VT_BSTR);
	ASSERT(pvCancel != NULL);
	*pvCancel = VARIANT_FALSE;
	

⌨️ 快捷键说明

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