UIHtmlView.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:17k
- //*******************************************************************************
- // COPYRIGHT NOTES
- // ---------------
- // You may use this source code, compile or redistribute it as part of your application
- // for free. You cannot redistribute it as a part of a software development
- // library without the agreement of the author. If the sources are
- // distributed along with the application, you should leave the original
- // copyright notes in the source code without any changes.
- // This code can be used WITHOUT ANY WARRANTIES at your own risk.
- //
- // For the latest updates to this code, check this site:
- // http://www.masmex.com
- // after Sept 2000
- //
- // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
- //*******************************************************************************
- // HtmlMsgView.cpp : implementation file
- //
- #include "stdafx.h"
- #include "UIHtmlView.h"
- #include "UIMessages.h"
- #include <atlbase.h>
- #include <mshtml.h>
- #include "UIres.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CUIHtmlView
- IMPLEMENT_DYNAMIC(CUIHtmlView, CHtmlView)
- CUIHtmlView::CUIHtmlView()
- {
- //{{AFX_DATA_INIT(CUIHtmlView)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- m_pHTMLDocument2 = NULL;
- m_hNotifyWnd = NULL;
- m_bSetCursor = false;
- }
- CUIHtmlView::~CUIHtmlView()
- {
- ReleaseDocument();
- }
- BOOL CUIHtmlView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Add your specialized code here and/or call the base class
- cs.lpszClass = AfxRegisterWndClass(
- CS_DBLCLKS,
- NULL,
- NULL,
- NULL);
- ASSERT(cs.lpszClass);
- BOOL bRet = CHtmlView::PreCreateWindow(cs);
- cs.dwExStyle |= WS_EX_CLIENTEDGE;
- // cs.style |= WS_BORDER;
- return bRet;
- }
- void CUIHtmlView::ReleaseDocument()
- {
- if (m_pHTMLDocument2)
- {
- m_pHTMLDocument2->Release();
- m_pHTMLDocument2 = NULL;
- }
- }
- void CUIHtmlView::DocumentReady()
- {
- m_bSetCursor = false;
- }
- bool CUIHtmlView::ExecScript(LPCTSTR pszScript,LPCTSTR pszLang,_variant_t *pvt)
- {
- bool bRet = false;
- CWaitCursor w;
- IHTMLWindow2 *pW2=NULL;
- IHTMLDocument2 *pDoc = GetHTMLDocument();
- if (pDoc == NULL)
- return bRet;
- HRESULT hr = pDoc->get_parentWindow(&pW2);
- if (SUCCEEDED(hr))
- {
- if (pszLang == NULL)
- pszLang = _T("JScript");
- _variant_t v;
- hr = pW2->execScript(_bstr_t(pszScript),_bstr_t(pszLang),&v);
- if (pvt)
- *pvt = v;
- pW2->Release();
- bRet= true;
- }
- return bRet;
- }
- CString CUIHtmlView::GetBodyText()
- {
- IHTMLElement *pElem=NULL;
- GetHTMLDocument()->get_body(&pElem);
- _bstr_t bstText;
- BSTR bsText;
- pElem->get_innerText(&bsText);
- pElem->Release();
- bstText = bsText;
- return (LPCTSTR)bstText;
- }
- CString CUIHtmlView::GetElementValue(LPCTSTR pszElemID)
- {
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- BSTR bsText;
- _bstr_t bstText;
- if (pElem)
- {
- IHTMLInputTextElement *pInputElem=NULL;
- HRESULT hr = pElem->QueryInterface(IID_IHTMLInputTextElement,(LPVOID*)&pInputElem);
- if (SUCCEEDED(hr))
- {
- pInputElem->get_value(&bsText);
- bstText= bsText;
- pInputElem->Release();
- pInputElem = NULL;
- }
- pElem->Release();
- }
- return (LPCTSTR)bstText;
- }
- CString CUIHtmlView::GetElementText(LPCTSTR pszElemID)
- {
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- if (pElem == NULL)
- return _T("");
- BSTR bsText;
- _bstr_t bstText;
- pElem->get_innerText(&bsText);
- bstText = bsText;
- pElem->Release();
- pElem = NULL;
- return (LPCTSTR)bstText;
- }
- CString CUIHtmlView::GetElementHTML(LPCTSTR pszElemID)
- {
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- BSTR bsText;
- _bstr_t bstText;
- if (pElem)
- {
- pElem->get_innerHTML(&bsText);
- bstText = bsText;
- pElem->Release();
- pElem = NULL;
- }
- return (LPCTSTR)bstText;
- }
- bool CUIHtmlView::SetElementValue(LPCTSTR pszElemID,LPCTSTR pszText)
- {
- bool bRet=false;
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- if (pElem)
- {
- IHTMLInputTextElement *pInputElem=NULL;
- HRESULT hr = pElem->QueryInterface(IID_IHTMLInputTextElement,(LPVOID*)&pInputElem);
- if (SUCCEEDED(hr))
- {
- pInputElem->put_value(_bstr_t(pszText));
- pInputElem->Release();
- pInputElem = NULL;
- bRet = true;
- }
- pElem->Release();
- pElem = NULL;
- }
- return bRet;
- }
- bool CUIHtmlView::SetElementText(LPCTSTR pszElemID,LPCTSTR pszText)
- {
- bool bRet=false;
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- if (pElem == NULL)
- return bRet;
- pElem->put_innerText(_bstr_t(pszText));
- pElem->Release();
- pElem = NULL;
- bRet= true;
- return bRet;
- }
- bool CUIHtmlView::SetElementHTML(LPCTSTR pszElemID,LPCTSTR pszText)
- {
- bool bRet=false;
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- if (pElem == NULL)
- return bRet;
- pElem->put_innerHTML(_bstr_t(pszText));
- pElem->Release();
- pElem = NULL;
- bRet= true;
- return bRet;
- }
- bool CUIHtmlView::SetImageSource(LPCTSTR pszElemID,LPCTSTR pszText)
- {
- bool bRet=false;
- IHTMLElement *pElem=NULL;
- GetElement(pszElemID,&pElem);
- if (pElem == NULL)
- return bRet;
- IHTMLImgElement *pImgElem=NULL;
- HRESULT hr = pElem->QueryInterface(IID_IHTMLImgElement,(LPVOID*)&pImgElem);
- pElem->Release();
- if (SUCCEEDED(hr))
- {
- pImgElem->put_src(_bstr_t(pszText));
- pImgElem->Release();
- bRet = true;
- }
- return bRet;
- }
- bool CUIHtmlView::GetOptionString(LPCTSTR pszElemID,CString &sText,CString &sValue)
- {
- IHTMLElement *pElement = NULL;
- GetElement(pszElemID,&pElement);
- bool bRet=false;
- if (pElement == NULL)
- return bRet;
- IHTMLSelectElement *pSelElem=NULL;
- HRESULT hr = pElement->QueryInterface(IID_IHTMLSelectElement,(LPVOID*)&pSelElem);
- pElement->Release();
- pElement = NULL;
- if (FAILED(hr))
- return bRet;
- long nSelIndex=-1;
- pSelElem->get_selectedIndex(&nSelIndex);
- if (nSelIndex == -1)
- {
- pSelElem->Release();
- return bRet;
- }
- IDispatch *pDisp=NULL;
- _variant_t vtName(nSelIndex);
- _variant_t vtIndex;
- pSelElem->item(vtName,vtIndex,&pDisp);
- IHTMLOptionElement *pOptElem=NULL;
- hr = pDisp->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pOptElem);
- if (SUCCEEDED(hr))
- {
- _bstr_t bstValue;
- BSTR bsValue;
- pOptElem->get_value(&bsValue);
- bstValue = bsValue;
- sValue = (LPCTSTR)bstValue;
- BSTR bsText;
- _bstr_t bstText;
- pOptElem->get_text(&bsText);
- bstText = bsText;
- sText = (LPCTSTR)bstText;
- pOptElem->Release();
- bRet=true;
- }
- if (pSelElem)
- pSelElem->Release();
- return bRet;
- }
- bool CUIHtmlView::SetOptionString(LPCTSTR pszElemID,LPCTSTR pszText)
- {
- IHTMLElement *pElement = NULL;
- GetElement(pszElemID,&pElement);
- bool bRet=false;
- if (pElement == NULL)
- return bRet;
- IHTMLSelectElement *pSelElem=NULL;
- IDispatch *pDisp=NULL;
- HRESULT hr = pElement->QueryInterface(IID_IHTMLSelectElement,(LPVOID*)&pSelElem);
- if (FAILED(hr))
- goto SOS_CleanUp;
- {
- long nLength=0;
- pSelElem->get_length(&nLength);
- for(long i=0;i < nLength;i++)
- {
- _variant_t vtName(i);
- _variant_t vtIndex;
- pSelElem->item(vtName,vtIndex,&pDisp);
- if (pDisp == NULL)
- continue;
- IHTMLOptionElement *pOptElem=NULL;
- hr = pDisp->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pOptElem);
- pDisp->Release();
- pDisp = NULL;
- if (SUCCEEDED(hr))
- {
- _bstr_t bstValue;
- _bstr_t bstText;
- BSTR bsValue;
- BSTR bsText;
- pOptElem->get_value(&bsValue);
- pOptElem->get_text(&bsText);
- bstValue = bsValue;
- bstText = bsText;
- pOptElem->Release();
- if (_tcsicmp((LPCTSTR)bstText,pszText) == 0)
- {
- pSelElem->put_selectedIndex(i);
- bRet=true;
- break;
- }
- }
- }
- }
- SOS_CleanUp:
- if (pElement)
- pElement->Release();
- if (pSelElem)
- pSelElem->Release();
- return bRet;
- }
- bool CUIHtmlView::AddOptionString(LPCTSTR pszElemID,LPCTSTR pszText,LPCTSTR pszValue,bool bSelect)
- {
- IHTMLElement *pElement = NULL;
- GetElement(pszElemID,&pElement);
- bool bRet=false;
- if (pElement == NULL)
- return bRet;
- IHTMLSelectElement *pSelElem=NULL;
- HRESULT hr = pElement->QueryInterface(IID_IHTMLSelectElement,(LPVOID*)&pSelElem);
- pElement->Release();
- if (FAILED(hr))
- return bRet;
- IHTMLElement *pNewElem=NULL;
- GetHTMLDocument()->createElement(_bstr_t(_T("OPTION")),&pNewElem);
- IHTMLOptionElement *pNewOptElem=NULL;
- hr = E_FAIL;
- if (pNewElem)
- hr = pNewElem->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pNewOptElem);
- if (SUCCEEDED(hr))
- {
- if (pszValue)
- {
- _bstr_t bsValue(pszValue);
- pNewOptElem->put_value(bsValue);
- }
- _bstr_t bsText(pszText);
- pNewOptElem->put_text(bsText);
- pSelElem->add(pNewElem,_variant_t(vtMissing));
- pNewOptElem->Release();
- if (bSelect)
- {
- long nLength=0;
- pSelElem->get_length(&nLength);
- if (nLength > 0)
- pSelElem->put_selectedIndex(nLength-1);
- }
- bRet=true;
- }
- if (pSelElem)
- pSelElem->Release();
- return bRet;
- }
- void CUIHtmlView::GetElement(LPCTSTR pszID,IHTMLElement **pElement)
- {
- *pElement=NULL;
- if (m_pHTMLDocument2 == NULL)
- return;
- CComQIPtr<IHTMLElementCollection> spAllElements;
- m_pHTMLDocument2->get_all(&spAllElements);
- if (spAllElements)
- {
- IDispatch *pDisp=NULL;
- HRESULT hr = spAllElements->item(CComVariant(pszID),CComVariant(0),&pDisp);
- if (SUCCEEDED(hr))
- {
- hr = pDisp->QueryInterface(IID_IHTMLElement,(LPVOID*)pElement);
- }
- pDisp->Release();
- }
- }
- void CUIHtmlView::ParseDocument()
- {
- if(m_pHTMLDocument2 == NULL)
- return;
- try
- {
- CComQIPtr<IHTMLDocument2> spDocument(m_pHTMLDocument2);
- CComQIPtr<IHTMLElementCollection> spAllElements;
- spDocument->get_all(&spAllElements);
- CComBSTR bsIsControl(_T("OBJECT"));
- CComBSTR bsIsImage(_T("IMG"));
- long nElems;
- spAllElements->get_length(&nElems);
- for(long i = 0; i < nElems; i++)
- {
- CComVariant vIndex(i, VT_I4);
- LPDISPATCH pDisp=NULL;
- spAllElements->item(vIndex,vIndex,&pDisp);
- CComQIPtr<IHTMLElement> spAnElement(pDisp);
- pDisp->Release();
- CComBSTR bsTagName;
- spAnElement->get_tagName(&bsTagName);
- if(bsTagName == bsIsControl)
- {
- // This will get you any ActiveX controls in a page. It is possible
- // to call methods and properties of the control off the IHTMLElementPtr.
- CComQIPtr<IHTMLObjectElement> spObj(spAnElement);
- ActiveXControl(spObj);
- }
- else if(bsTagName == bsIsImage)
- {
- CComQIPtr<IHTMLImgElement> spImg(spAnElement);
- ImageElement(spImg);
- }
- else
- Element(spAnElement);
- }
- }
- catch(...)
- {
- #ifdef _DEBUG
- AfxMessageBox(_T("Unspecified exception thrown in UIHtmlView"),MB_ICONSTOP);
- #endif
- throw;
- }
- }
- void CUIHtmlView::ActiveXControl(IHTMLObjectElement *pObj)
- {
- }
- void CUIHtmlView::ImageElement(IHTMLImgElement *pImg)
- {
- }
- void CUIHtmlView::Element(IHTMLElement *pElement)
- {
- }
- void CUIHtmlView::DoDataExchange(CDataExchange* pDX)
- {
- CHtmlView::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CUIHtmlView)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CUIHtmlView, CHtmlView)
- //{{AFX_MSG_MAP(CUIHtmlView)
- ON_WM_SETCURSOR()
- ON_COMMAND(ID_BROWSER_GO_BACK, OnBrowserGoBack)
- ON_COMMAND(ID_BROWSER_GO_FORWARD, OnBrowserGoForward)
- ON_COMMAND(ID_BROWSER_GO_BACK, OnBrowserGoBack)
- ON_UPDATE_COMMAND_UI(ID_BROWSER_GO_FORWARD, OnUpdateBrowserGoForward)
- ON_UPDATE_COMMAND_UI(ID_BROWSER_GO_BACK, OnUpdateBrowserGoBack)
- ON_COMMAND(ID_BROWSER_GO_HOME, OnBrowserGoHome)
- ON_COMMAND(ID_BROWSER_REFRESH, OnBrowserRefresh)
- ON_COMMAND(ID_BROWSER_STOP, OnBrowserStop)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CUIHtmlView diagnostics
- #ifdef _DEBUG
- void CUIHtmlView::AssertValid() const
- {
- CHtmlView::AssertValid();
- }
- void CUIHtmlView::Dump(CDumpContext& dc) const
- {
- CHtmlView::Dump(dc);
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CUIHtmlView message handlers
- void CUIHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
- {
- // TODO: Add your specialized code here and/or call the base class
-
- HRESULT hr;
- LPUNKNOWN lpUnknown;
- LPUNKNOWN lpUnknownWB = NULL;
- LPUNKNOWN lpUnknownDC = NULL;
- lpUnknown = m_wndBrowser.GetControlUnknown();
- ASSERT(lpUnknown);
- if (lpUnknown)
- {
- // Get the IUnknown of the WebBrowser control being hosted.
- // The IUnknown returned from GetControlUnknown is not the
- // IUnknown of the WebBrowser control. It's actually a
- // IOleObject pointer.
- //
- hr = lpUnknown->QueryInterface(IID_IUnknown,
- (LPVOID*)&lpUnknownWB);
- ASSERT(SUCCEEDED(hr));
- if (FAILED(hr))
- return;
- // Get the IUnknown of the object that fired this event.
- //
- hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC);
- ASSERT(SUCCEEDED(hr));
- if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
- {
- // The document has finished loading.
- //
- LPDISPATCH pDispatch = GetHtmlDocument();
- if (pDispatch)
- {
- hr = pDispatch->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&m_pHTMLDocument2);
- DocumentReady();
- pDispatch->Release();
- }
- }
- if (lpUnknownWB)
- lpUnknownWB->Release();
- if (lpUnknownDC)
- lpUnknownDC->Release();
- }
- }
- void CUIHtmlView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
- {
- // TODO: Add your specialized code here and/or call the base class ReleaseDocument();
- m_bSetCursor = true;
- #ifdef _DEBUG
- if (GetKeyState(VK_LCONTROL) < 0)
- {
- if (baPostedData.GetSize() > 0)
- {
- LPTSTR pszData = new TCHAR[baPostedData.GetSize()+1];
- LPTSTR pszPosted = pszData;
- for(int i=0;i < baPostedData.GetSize();i++)
- {
- *pszPosted = baPostedData[i];
- pszPosted =_tcsinc(pszPosted);
- }
- *pszPosted = ' ';
- CString sMess;
- sMess = _T("Posted Data: ");
- sMess += pszData;
- sMess += _T("n");
- sMess += _T("URL: ");
- sMess += lpszURL;
- AfxMessageBox(sMess);
- delete pszData;
- }
- }
- #endif
- ReleaseDocument();
- if (m_hNotifyWnd)
- {
- ::SendMessage(m_hNotifyWnd,WM_APP_CB_IE_SET_EDIT_TEXT,(WPARAM)lpszURL,0);
- }
- CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
- }
- BOOL CUIHtmlView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
- {
- // TODO: Add your message handler code here and/or call default
- if (m_bSetCursor)
- {
- SetCursor(::LoadCursor(NULL,IDC_APPSTARTING));
- return TRUE;
- }
-
- return CHtmlView::OnSetCursor(pWnd, nHitTest, message);
- }
- void CUIHtmlView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
- {
- // TODO: Add your specialized code here and/or call the base class
-
- }
- void CUIHtmlView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
- {
- // TODO: Add your specialized code here and/or call the base class
- CHtmlView::OnActivateView(bActivate, pActivateView, pDeactiveView);
- if (bActivate && pDeactiveView != NULL)
- {
- OnTitleChange(GetLocationURL());
- SetActiveWindow();
- }
- }
- void CUIHtmlView::OnCommandStateChange(long nCommand, BOOL bEnable)
- {
- // TODO: Add your specialized code here and/or call the base class
- switch(nCommand)
- {
- case CSC_NAVIGATEFORWARD:
- m_bGoForward = bEnable;
- break;
- case CSC_NAVIGATEBACK:
- m_bGoBack = bEnable;
- break;
- default:
- break;
- }
-
- CHtmlView::OnCommandStateChange(nCommand, bEnable);
- }
- void CUIHtmlView::OnUpdateBrowserGoBack(CCmdUI *pUI)
- {
- pUI->Enable(m_bGoBack);
- }
- void CUIHtmlView::OnUpdateBrowserGoForward(CCmdUI *pUI)
- {
- pUI->Enable(m_bGoForward);
- }
- void CUIHtmlView::OnBrowserGoBack()
- {
- // TODO: Add your command handler code here
- GoBack();
- }
- void CUIHtmlView::OnBrowserGoForward()
- {
- // TODO: Add your command handler code here
- GoForward();
- }
- void CUIHtmlView::OnBrowserGoHome()
- {
- // TODO: Add your command handler code here
- GoHome();
- }
- void CUIHtmlView::OnBrowserRefresh()
- {
- // TODO: Add your command handler code here
- Refresh();
- }
- void CUIHtmlView::OnBrowserStop()
- {
- // TODO: Add your command handler code here
- Stop();
- }
- void CUIHtmlView::OnDocumentComplete(LPCTSTR lpszUrl)
- {
- // make sure the main frame has the new URL. This call also stops the animation
- if (m_hNotifyWnd)
- {
- ::SendMessage(m_hNotifyWnd,WM_APP_CB_IE_SET_EDIT_TEXT,(WPARAM)lpszUrl,0);
- }
- CHtmlView::OnDocumentComplete(lpszUrl);
- }
- void CUIHtmlView::OnTitleChange(LPCTSTR lpszText)
- {
- // this will change the main frame's title bar
- if (m_pDocument != NULL)
- m_pDocument->SetTitle(lpszText);
- }