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

📄 htmlviewben.cpp

📁 一个多窗口的浏览器的程序benbrowse
💻 CPP
字号:
// HtmlViewBen.cpp : implementation file
//

#include "stdafx.h"
#include "benbenBrowser.h"
#include "HtmlViewBen.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHtmlViewBen
#define IDC_BROWSER_CONTROL 2

IMPLEMENT_DYNCREATE(CHtmlViewBen, CView)

CHtmlViewBen::CHtmlViewBen()
{
}

CHtmlViewBen::~CHtmlViewBen()
{
}


BEGIN_MESSAGE_MAP(CHtmlViewBen, CView)
	//{{AFX_MSG_MAP(CHtmlViewBen)
	ON_WM_SIZE()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
	ON_WM_PARENTNOTIFY()
END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CHtmlViewBen, CView)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 102 /* StatusTextChange */, OnStatusTextChange, VTS_BSTR)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 108 /* ProgressChange */, OnProgressChange, VTS_I4 VTS_I4)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 105 /* CommandStateChange */, OnCommandStateChange, VTS_I4 VTS_BOOL)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 106 /* DownloadBegin */, OnDownloadBegin, VTS_NONE)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 104 /* DownloadComplete */, OnDownloadComplete, VTS_NONE)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 113 /* TitleChange */, OnTitleChange, VTS_BSTR)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 252 /* NavigateComplete2 */, NavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 250 /* BeforeNavigate2 */, BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 251 /* NewWindow2 */, OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)
	ON_EVENT(CHtmlViewBen, IDC_BROWSER_CONTROL, 259 /* DocumentComplete */, DocumentComplete, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHtmlViewBen drawing

void CHtmlViewBen::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CHtmlViewBen diagnostics

#ifdef _DEBUG
void CHtmlViewBen::AssertValid() const
{
	CView::AssertValid();
}

void CHtmlViewBen::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHtmlViewBen message handlers

void CHtmlViewBen::GoBack()
{
	try
	{
		m_wndBrowser.GoBack();
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::GoForward()
{
	try
	{
		m_wndBrowser.GoForward();
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::GoHome()
{
	try
	{
		m_wndBrowser.GoHome();
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::GoSearch()
{
	//m_wndBrowser.GoSearch();
}

void CHtmlViewBen::Navigate(LPCTSTR URL, DWORD dwFlags,
							LPCTSTR lpszTargetFrameName,
							LPCTSTR lpszHeaders,
							LPVOID lpvPostData ,
							DWORD dwPostDataLen)
{
	COleSafeArray vPostData;
	BSTR bstrURL=NULL;
	try
	{
		if (lpvPostData != NULL)
		{
			if (dwPostDataLen == 0)
				dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
			
			vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
		}
		
		CString strURL(URL);
		bstrURL = strURL.AllocSysString();
		m_wndBrowser.Navigate(strURL,
			COleVariant((long) dwFlags, VT_I4),
			COleVariant(lpszTargetFrameName, VT_BSTR),
			vPostData,
			COleVariant(lpszHeaders, VT_BSTR));
	}
	catch(...)
	{
	}
	try
	{
		if(bstrURL!=NULL)
			SysFreeString(bstrURL);
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::Navigate2(LPCTSTR lpszURL, DWORD dwFlags,
							 LPCTSTR lpszTargetFrameName,
							 LPCTSTR lpszHeaders,
							 LPVOID lpvPostData /* = NULL */, 
							 DWORD dwPostDataLen /* = 0 */)
{
	COleSafeArray vPostData;
	try
	{
		if (lpvPostData != NULL)
		{
			if (dwPostDataLen == 0)
				dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
			
			vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
		}
		
		COleVariant vURL(lpszURL, VT_BSTR);
		COleVariant vHeaders(lpszHeaders, VT_BSTR);
		COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
		COleVariant vFlags((long) dwFlags, VT_I4);
		m_wndBrowser.Navigate2(vURL,
			vFlags, vTargetFrameName, vPostData, vHeaders);
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::Navigate2(LPITEMIDLIST pIDL, DWORD dwFlags,LPCTSTR lpszTargetFrameName )
{
	COleVariant vPIDL(pIDL);
	COleVariant empty;
	try
	{
		m_wndBrowser.Navigate2(vPIDL,
			COleVariant((long) dwFlags, VT_I4),
			COleVariant(lpszTargetFrameName, VT_BSTR),
			empty, empty);
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::Navigate2(LPCTSTR lpszURL, DWORD dwFlags, 
							 CByteArray &baPostData,
							 LPCTSTR lpszTargetFrameName, 
							 LPCTSTR lpszHeaders)
{
	COleVariant vPostData = baPostData;
	COleVariant vURL(lpszURL, VT_BSTR);
	COleVariant vHeaders(lpszHeaders, VT_BSTR);
	COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
	COleVariant vFlags((long) dwFlags, VT_I4);
	try
	{
		m_wndBrowser.Navigate2(vURL, vFlags, vTargetFrameName,
			vPostData, vHeaders);
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::Refresh()
{
	try
	{
		m_wndBrowser.Refresh();
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::Refresh2(int nLevel)
{
	try
	{
		m_wndBrowser.Refresh2(COleVariant((long) nLevel, VT_I4));
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::Stop()
{
	try
	{
		m_wndBrowser.Stop();
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
{
	try
	{
		m_wndBrowser.ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut);
	}
	catch(...)
	{
	}

}

BOOL CHtmlViewBen::LoadFromResource(LPCTSTR lpszResource)
{
	HINSTANCE hInstance = AfxGetResourceHandle();
	ASSERT(hInstance != NULL);

	CString strResourceURL;
	BOOL bRetVal = TRUE;
	try
	{
		TCHAR lpszModule[_MAX_PATH];
		if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
		{
			strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
			Navigate(strResourceURL, 0, 0, 0);
		}
		else
			bRetVal = FALSE;
	}
	catch(...)
	{
	}
	
	return bRetVal;
}

BOOL CHtmlViewBen::LoadFromResource(UINT nRes)
{
	HINSTANCE hInstance = AfxGetResourceHandle();
	ASSERT(hInstance != NULL);

	CString strResourceURL;
	BOOL bRetVal = TRUE;
	try
	{
		LPTSTR lpszModule = new TCHAR[_MAX_PATH];
		
		if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
		{
			strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
			Navigate(strResourceURL, 0, 0, 0);
		}
		else
			bRetVal = FALSE;
		
		delete [] lpszModule;
	}
	catch(...)
	{
	}
	return bRetVal;
}

/*void CHtmlViewBen::PutProperty(LPCTSTR lpszProperty, const VARIANT &vtValue)
{
	m_wndBrowser.PutProperty(lpszProperty, vtValue);

}


COleVariant CHtmlViewBen::GetProperty(LPCTSTR lpszProperty)
{
	COleVariant result;

	static BYTE parms[] =
		VTS_BSTR;
	m_wndBrowser.InvokeHelper(0x12f, DISPATCH_METHOD,
		VT_VARIANT, (void*)&result, parms, lpszProperty);

	return result;

}

BOOL CHtmlViewBen::GetProperty(LPCTSTR lpszProperty, CString &strValue)
{
	CString strProperty(lpszProperty);
	BSTR bstrProperty = strProperty.AllocSysString();

	BOOL bResult = FALSE;
	VARIANT vReturn;
	vReturn.vt = VT_BSTR;
	vReturn.bstrVal = NULL;
	HRESULT hr = m_wndBrowser.GetProperty(bstrProperty, &vReturn);

	if (SUCCEEDED(hr))
	{
		strValue = CString(vReturn.bstrVal);
		bResult = TRUE;
	}

	::SysFreeString(bstrProperty);
	return bResult;
}
*/

LPDISPATCH CHtmlViewBen::GetApplication()
{
	try
	{
		return m_wndBrowser.GetApplication();
	}
	catch(...)
	{
		return NULL;
	}
}

LPDISPATCH CHtmlViewBen::GetContainer() 
{
//	return m_wndBrowser.GetContainer();
	return NULL;
}


LPDISPATCH CHtmlViewBen::GetHtmlDocument() 
{
	try
	{
		return m_wndBrowser.GetDocument();
	}
	catch(...)
	{
		return NULL;
	}
}


LPDISPATCH CHtmlViewBen::GetParentBrowser() 
{
	try
	{
		return (IDispatch *)m_wndBrowser.GetParent();
	}
	catch(...)
	{
		return NULL;
	}
}

CString CHtmlViewBen::GetFullName()
{
//	return m_wndBrowser.GetName();
	return CString("");
}

CString CHtmlViewBen::GetLocationURL()
{	
	CString URL="";
	try
	{
		URL=m_wndBrowser.GetLocationURL();
	}
	catch(...)
	{
	}
	return URL;
}

CString CHtmlViewBen::GetLocationName()
{
	CString Name;
	try
	{
		Name=m_wndBrowser.GetLocationName();
	}
	catch(...)
	{
	}
	return Name;
}

BOOL CHtmlViewBen::GetOffline()
{
//	return m_wndBrowser.GetOffline();
	return 0; 
}

void CHtmlViewBen::SetOffline(BOOL bNewValue)
{
//	m_wndBrowser.SetOffline(bNewValue);
}

READYSTATE CHtmlViewBen::GetReadyState()
{
	return (READYSTATE)m_wndBrowser.GetReadyState();
}

BOOL CHtmlViewBen::GetBusy()
{
	BOOL busy;
	try
	{
		busy=m_wndBrowser.GetBusy();
	}
	catch(...)
	{
	}
	return busy;
}

long CHtmlViewBen::GetLeft()
{
	long left;
	try
	{
		left=m_wndBrowser.GetLeft();
	}
	catch(...)
	{
	}
	return left;
}

void CHtmlViewBen::SetLeft(long nNewValue)
{
	try
	{
		m_wndBrowser.SetLeft(nNewValue);
	}
	catch(...)
	{
	}
}


long CHtmlViewBen::GetTop()
{
	long top;
	try
	{
		top=m_wndBrowser.GetTop();
	}
	catch(...)
	{
	}
	return top;
}


void CHtmlViewBen::SetTop(long nNewValue)
{
	try
	{
		m_wndBrowser.SetTop(nNewValue);
	}
	catch(...)
	{
	}
}

long CHtmlViewBen::GetHeight()
{
	long  height;
	try
	{
		height=m_wndBrowser.GetHeight();
	}
	catch(...)
	{
	}
	return height;
}

void CHtmlViewBen::SetHeight(long nNewValue)
{
	try
	{
		m_wndBrowser.SetHeight(nNewValue);
	}
	catch(...)
	{
	}
}

BOOL CHtmlViewBen::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
//	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
	try
	{
	if (!CView::Create(lpszClassName, lpszWindowName,
				dwStyle, rect, pParentWnd,  nID, pContext))
	{
		return FALSE;
	}

	if(!m_wndBrowser.Create ("Browser", WS_VISIBLE|WS_CHILD|WS_TABSTOP, CRect (0,0,100,100), this, IDC_BROWSER_CONTROL))
	{
		DestroyWindow();
		return FALSE;
	}
	}
	catch(...)
	{
	}
		return TRUE;
}

void CHtmlViewBen::OnStatusTextChange(LPCTSTR pszText)
{	
	try
	{
		CFrameWnd* pFrame = GetParentFrame();
		if (pFrame != NULL)
			pFrame->SetMessageText(pszText);
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::OnProgressChange(long lProgress, long lProgressMax)
{
	
}

void CHtmlViewBen::OnCommandStateChange(long lCommand, BOOL bEnable)
{

}

void CHtmlViewBen::OnDownloadBegin()
{

}

void CHtmlViewBen::OnDownloadComplete()
{

}

void CHtmlViewBen::OnTitleChange(LPCTSTR lpszText)
{

}

void CHtmlViewBen::OnNavigateComplete2(LPCTSTR lpszURL)
{

}

void CHtmlViewBen::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
	LPCTSTR lpszTargetFrameName, CByteArray& baPostData,
	LPCTSTR lpszHeaders, BOOL* bCancel)
{	
	* bCancel=FALSE;
}

void CHtmlViewBen::OnNewWindow2(LPDISPATCH *ppDisp, BOOL *bCancel)
{
		*bCancel = FALSE;
}
/////event
void CHtmlViewBen::DocumentComplete(LPDISPATCH pDisp, VARIANT *URL)
{
	UNUSED_ALWAYS(pDisp);
	ASSERT(V_VT(URL) == VT_BSTR);

	CString str(V_BSTR(URL));
	OnDocumentComplete(str);
}

void CHtmlViewBen::BeforeNavigate2(LPDISPATCH pDisp, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers, BOOL *Cancel)
{
	ASSERT(V_VT(URL) == VT_BSTR);
	ASSERT(V_VT(TargetFrameName) == VT_BSTR);
	ASSERT(V_VT(PostData) == (VT_VARIANT | VT_BYREF));
	ASSERT(V_VT(Headers) == VT_BSTR);
	ASSERT(Cancel != NULL);
	try
	{
		USES_CONVERSION;
		
		VARIANT* vtPostedData = V_VARIANTREF(PostData);
		CByteArray array;
		if (V_VT(vtPostedData) & VT_ARRAY)
		{
			// must be a vector of bytes
			ASSERT(vtPostedData->parray->cDims == 1 && vtPostedData->parray->cbElements == 1);
			
			vtPostedData->vt |= VT_UI1;
			COleSafeArray safe(vtPostedData);
			
			DWORD dwSize = safe.GetOneDimSize();
			LPVOID pVoid;
			safe.AccessData(&pVoid);
			
			array.SetSize(dwSize);
			LPBYTE lpByte = array.GetData();
			
			memcpy(lpByte, pVoid, dwSize);
			safe.UnaccessData();
		}
		// make real parameters out of the notification
		
		CString strTargetFrameName(V_BSTR(TargetFrameName));
		CString strURL = V_BSTR(URL);
		CString strHeaders = V_BSTR(Headers);
		DWORD nFlags = V_I4(Flags);
		
		// notify the user's class
		OnBeforeNavigate2(strURL, nFlags, strTargetFrameName,
			array, strHeaders, Cancel);
	}
	catch(...)
	{
	}
}

void CHtmlViewBen::NavigateComplete2(LPDISPATCH pDisp, VARIANT *URL)
{
	ASSERT(V_VT(URL) == VT_BSTR);

	USES_CONVERSION;

	CString str = OLE2T(V_BSTR(URL));
	OnNavigateComplete2(str);
}

void CHtmlViewBen::OnDocumentComplete(LPCTSTR lpszURL)
{

}

OLECMDF CHtmlViewBen::QueryStatusWB(OLECMDID cmdID)
{
	return (OLECMDF)m_wndBrowser.QueryStatusWB(cmdID);
}
void CHtmlViewBen::OnParentNotify(UINT message, LPARAM lParam) 
{
	CView::OnParentNotify(message, lParam);
	
	// TODO: Add your message handler code here
	if(message == WM_DESTROY)
		GetParentFrame()->PostMessage(WM_CLOSE);
}

void CHtmlViewBen::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	try
	{
		if(m_wndBrowser)
		{
			if(::IsWindow(m_wndBrowser.m_hWnd))
				m_wndBrowser.MoveWindow(-2,-2, cx+4, cy+4);
		}
	}
	catch(...)
	{
	}
}

BOOL CHtmlViewBen::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (CView::PreTranslateMessage(pMsg))
		return TRUE;
	short ks;
	try
	{
		ks =GetKeyState(VK_CONTROL);
		if(pMsg->message == WM_KEYDOWN && pMsg->wParam != VK_ESCAPE&& pMsg->wParam != VK_F11&&pMsg->wParam != VK_F2 && pMsg->wParam != VK_F3&&pMsg->wParam != VK_F4 && pMsg->wParam != VK_F5 && (ks>=0 || pMsg->wParam==VK_CONTROL || pMsg->wParam=='C' || pMsg->wParam == 'X' || pMsg->wParam == 'V' || pMsg->wParam == 'Z' || pMsg->wParam == VK_INSERT||pMsg->wParam == 'A'||pMsg->wParam == 'F')) 
		{	
			//	if(pMsg->wParam == VK_RETURN)
			//	{
			//		return FALSE;
			//	}
			//	else
			return PreTranslateInput(pMsg);
		}
	}
	catch(...)
	{
	}
	return FALSE;
}


BOOL CHtmlViewBen::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default

	//add this function to erase flash when switch  the next tab
	return 0;
	//return CView::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

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