📄 ctrlweb.cpp
字号:
//
// 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 + -