📄 htmleditctrl2.cpp
字号:
// WebBrowserEdit.cpp: implementation of the CWebBrowserEdit class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HtmlEditCtrl2.h"
#include "AtlBase.H"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
// CHtmlEditCtrl2
CHtmlEditCtrl2::CHtmlEditCtrl2()
{
m_hResult = E_FAIL;
m_pDispatch = NULL;
m_pHtmlDoc = NULL;
m_pCmdTarg = NULL;
}
CHtmlEditCtrl2::~CHtmlEditCtrl2()
{
if(m_pDispatch)
{
m_pDispatch->Release();
}
if(m_pHtmlDoc)
{
m_pHtmlDoc->Release();
}
if(m_pCmdTarg)
{
m_pCmdTarg->Release();
}
}
/*
IZ: Function to retive all tags that contains images (like <img src="http://www.server.com/image.jpg>") from HTML document
Was not present in orginal CHtmlEditCtrlBase
*/
HRESULT CHtmlEditCtrl2::GetURLsOfAllImages(CStringArray& a_arrImages)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElementCollection* pImages;
m_hResult = m_pHtmlDoc->get_images(&pImages);
if( SUCCEEDED(m_hResult) && pImages )
{
long lNumberOfItems = 0;
m_hResult = pImages->get_length(&lNumberOfItems);
if( SUCCEEDED(m_hResult) )
{
IDispatch *ppvDisp;
IHTMLImgElement *ppvElement;
for (long ix=0; ix<lNumberOfItems; ix++)
{
CComVariant index = ix;
m_hResult = pImages->item( index, index, &ppvDisp );
if( SUCCEEDED(m_hResult) && ppvDisp )
{
m_hResult = ppvDisp->QueryInterface( IID_IHTMLImgElement , (void **) &ppvElement);
ppvDisp->Release();
if ( SUCCEEDED(m_hResult) && ppvElement )
{
BSTR bstrText;
CString sText;
m_hResult = ppvElement->get_src(&bstrText);
ppvElement->Release();
BSTR2CString(bstrText, sText);
::SysFreeString(bstrText);
a_arrImages.Add( sText );
}
}
}
}
pImages->Release();
}
return m_hResult;
}
/*
IZ: Was not present in orginal CHtmlEditCtrlBase
*/
HRESULT CHtmlEditCtrl2::ReplaceImageURL(const CString& a_sUrlToReplace, const CString& a_sUrlToReplaceWith)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElementCollection* pImages;
m_hResult = m_pHtmlDoc->get_images(&pImages);
if( SUCCEEDED(m_hResult) && pImages)
{
long lNumberOfItems = 0;
m_hResult = pImages->get_length(&lNumberOfItems);
if( SUCCEEDED(m_hResult) )
{
IDispatch *ppvDisp;
IHTMLImgElement *ppvElement;
for (long ix=0; ix<lNumberOfItems; ix++)
{
CComVariant index = ix;
m_hResult = pImages->item( index, index, &ppvDisp );
if( SUCCEEDED(m_hResult) && ppvDisp )
{
m_hResult = ppvDisp->QueryInterface( IID_IHTMLImgElement , (void **) &ppvElement);
ppvDisp->Release();
if ( SUCCEEDED(m_hResult) && ppvElement )
{
BSTR bstrText;
CString sText;
m_hResult = ppvElement->get_src(&bstrText);
BSTR2CString(bstrText, sText);
SysFreeString(bstrText);
if(a_sUrlToReplace == sText)
{
bstrText = a_sUrlToReplaceWith.AllocSysString();
m_hResult = ppvElement->put_src(bstrText);
SysFreeString(bstrText);
}
ppvElement->Release();
}
}
}
}
pImages->Release();
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetBodyColorParameters(CString& a_sColor, BOOL a_bTextColor)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElement* pElem;
m_hResult = m_pHtmlDoc->get_body(&pElem);
if( SUCCEEDED(m_hResult) && pElem )
{
IHTMLBodyElement* pBodyElem;
m_hResult = pElem->QueryInterface( IID_IHTMLBodyElement, (void**)&pBodyElem );
pElem->Release();
if( SUCCEEDED(m_hResult) && pBodyElem )
{
CComVariant vaRet;
if(a_bTextColor)
m_hResult = pBodyElem->get_text( &vaRet );
else
m_hResult = pBodyElem->get_bgColor( &vaRet );
pBodyElem->Release();
if(vaRet.vt & VT_BSTR)
{
BSTR2CString(vaRet.bstrVal, a_sColor);
}
else if(vaRet.vt & VT_I4)
{
ASSERT(0);//IZ TO CHECK
a_sColor.Format("%d", vaRet.lVal);
}
else
{
ASSERT(0);
}
}
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetBodyBackgroundColor(CString& a_sColor)
{
return GetBodyColorParameters(a_sColor, FALSE);
}
HRESULT CHtmlEditCtrl2::GetBodyTextColor(CString& a_sColor)
{
return GetBodyColorParameters(a_sColor, TRUE);
}
HRESULT CHtmlEditCtrl2::GetBodyBackgroundImage(CString& a_sImage)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElement* pElem;
m_hResult = m_pHtmlDoc->get_body(&pElem);
if( SUCCEEDED(m_hResult) && pElem )
{
IHTMLBodyElement* pBodyElem;
m_hResult = pElem->QueryInterface( IID_IHTMLBodyElement, (void**)&pBodyElem );
pElem->Release();
if( SUCCEEDED(m_hResult) && pBodyElem )
{
BSTR bstrBody;
m_hResult = pBodyElem->get_background( &bstrBody );
pBodyElem->Release();
BSTR2CString(bstrBody, a_sImage);
SysFreeString(bstrBody);
}
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetBodyProperties(CString& a_sTag)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElement* pElem;
m_hResult = m_pHtmlDoc->get_body(&pElem);
if( SUCCEEDED(m_hResult) && pElem )
{
IHTMLBodyElement* pBodyElem;
m_hResult = pElem->QueryInterface( IID_IHTMLBodyElement, (void**)&pBodyElem );
pElem->Release();
if( SUCCEEDED(m_hResult) && pBodyElem )
{
BSTR bstrBody;
m_hResult = pBodyElem->get_bgProperties( &bstrBody );
pBodyElem->Release();
BSTR2CString(bstrBody, a_sTag);
SysFreeString(bstrBody);
}
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::SetBodyBackgroundImage(const CString& a_sImage)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElement* pElem;
m_hResult = m_pHtmlDoc->get_body(&pElem);
if( SUCCEEDED(m_hResult) && pElem )
{
IHTMLBodyElement* pBodyElem;
m_hResult = pElem->QueryInterface( IID_IHTMLBodyElement, (void**)&pBodyElem );
pElem->Release();
if( SUCCEEDED(m_hResult) && pBodyElem )
{
BSTR bstrBody = a_sImage.AllocSysString();
m_hResult = pBodyElem->put_background( bstrBody );
pBodyElem->Release();
::SysFreeString(bstrBody);
}
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetDocumentCharset(CString& a_sCharsetEncoding)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
BSTR bstrCharset;
m_hResult = m_pHtmlDoc->get_charset(&bstrCharset);
BSTR2CString(bstrCharset, a_sCharsetEncoding);
SysFreeString(bstrCharset);
return m_hResult;
}
HRESULT CHtmlEditCtrl2::SetDocumentCharset(const CString& a_sCharsetEncoding)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
BSTR bstrCharset = a_sCharsetEncoding.AllocSysString();
m_hResult = m_pHtmlDoc->put_charset(bstrCharset);
::SysFreeString(bstrCharset);
return m_hResult;
}
BOOL CHtmlEditCtrl2::PrepareInterfaces()
{
m_hResult = E_FAIL;
if(m_pDispatch == NULL)
{
m_pDispatch = CWebBrowser2::GetDocument();
if(m_pDispatch)
{
m_hResult = m_pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&m_pHtmlDoc);
m_hResult = m_pDispatch->QueryInterface(IID_IOleCommandTarget, (void**)&m_pCmdTarg);
}
}
return m_pDispatch && m_pHtmlDoc && m_pCmdTarg;
}
BOOL CHtmlEditCtrl2::SetDesignMode(BOOL bMode)
{
if( PrepareInterfaces() == FALSE)
{
return FALSE;
}
m_hResult = m_pHtmlDoc->put_designMode(bMode ? L"On" : L"Off");
return SUCCEEDED( m_hResult );
}
BOOL CHtmlEditCtrl2::IsDesignMode()
{
if(PrepareInterfaces() == FALSE)
{
return FALSE;
}
BSTR bstrDesignMode;
m_pHtmlDoc->get_designMode( &bstrDesignMode );
CString sMode;
BSTR2CString(bstrDesignMode, sMode);
SysFreeString(bstrDesignMode);
return ( sMode == "On" );
}
HRESULT CHtmlEditCtrl2::ExecCommand(const GUID *pGuid, long cmdID, long cmdExecOpt, VARIANT* pInVar, VARIANT* pOutVar)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
return m_pCmdTarg->Exec(pGuid, cmdID, cmdExecOpt, pInVar , pOutVar);
}
HRESULT CHtmlEditCtrl2::ExecCommand(long cmdID, long cmdExecOpt, VARIANT* pInVar, VARIANT* pOutVar)
{
return ExecCommand(&CGID_MSHTML, cmdID, cmdExecOpt, pInVar , pOutVar );
}
long CHtmlEditCtrl2::QueryStatus(long cmdID)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
OLECMD ocmd = {cmdID, 0};
if (S_OK == m_pCmdTarg->QueryStatus(&CGID_MSHTML, 1, &ocmd, NULL))
return ocmd.cmdf;
return 0;
}
HRESULT CHtmlEditCtrl2::GetEvent(IHTMLEventObj **ppEventObj)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLWindow2* sphtmlWnd = NULL;
if (!ppEventObj)
return E_POINTER;
*ppEventObj = NULL;
HRESULT hr = E_FAIL;
m_hResult = m_pHtmlDoc->get_parentWindow(&sphtmlWnd);
if(m_hResult == S_OK)
{
m_hResult = sphtmlWnd->get_event(ppEventObj);
sphtmlWnd->Release();
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetEventSrcElement(IHTMLElement **ppSrcElement)
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLEventObj* spEventObj = NULL;
if (!ppSrcElement)
return E_POINTER;
*ppSrcElement = NULL;
m_hResult = GetEvent(&spEventObj);
if (m_hResult == S_OK)
{
m_hResult = spEventObj->get_srcElement(ppSrcElement);
spEventObj->Release();
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetDocument(IHTMLDocument2** ppDoc)
{
if( PrepareInterfaces() == FALSE)
{
return E_NOINTERFACE;
}
*ppDoc = m_pHtmlDoc;
m_pHtmlDoc->AddRef();
return S_OK;
}
HRESULT CHtmlEditCtrl2::NewDocument()
{
if( PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IPersistStreamInit* spPSI;
m_hResult = m_pHtmlDoc->QueryInterface(IID_IPersistStreamInit, (void**)&spPSI);
if( SUCCEEDED(m_hResult) && spPSI )
{
m_hResult = spPSI->InitNew();
spPSI->Release();
}
return m_hResult;
}
/*
//IZ WARNING - NOT UNICODE AWARE FUNCTION!
*/
HRESULT CHtmlEditCtrl2::GetDocumentBody(CString& a_sBody, BOOL a_bTextInsteadHTML)
{
if(PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IHTMLElement* pElem;
m_hResult = m_pHtmlDoc->get_body(&pElem);
if( SUCCEEDED(m_hResult) && pElem )
{
BSTR bstrText;
if(a_bTextInsteadHTML)
m_hResult = pElem->get_innerText(&bstrText);
else
m_hResult = pElem->get_outerHTML(&bstrText);
BSTR2CString(bstrText, a_sBody);
SysFreeString(bstrText);
pElem->Release();
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetDocumentHTML(CString& szHTML, BOOL a_bClearDirtyFlag)
{
if(PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IPersistStreamInit* spPSI;
CStreamOnCString stream;
m_hResult = m_pHtmlDoc->QueryInterface(IID_IPersistStreamInit, (void**)&spPSI);
if( SUCCEEDED(m_hResult) && spPSI )
{
m_hResult = spPSI->Save(static_cast<IStream*>(&stream), a_bClearDirtyFlag);
if (m_hResult == S_OK)
{
if (!stream.CopyData(szHTML))
m_hResult = E_OUTOFMEMORY;
}
spPSI->Release();
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::SetDocumentHTML(LPCTSTR szHTML)
{
if(PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IPersistStreamInit* spPSI;
CStreamOnCString stream(szHTML);
if (m_pHtmlDoc)
{
m_hResult = m_pHtmlDoc->QueryInterface(IID_IPersistStreamInit, (void**)&spPSI);
if( SUCCEEDED(m_hResult) && spPSI )
{
m_hResult = spPSI->Load(static_cast<IStream*>(&stream));
spPSI->Release();
}
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetIsDirty()
{
if(PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
IPersistStreamInit* spPSI;
if (m_pHtmlDoc)
{
m_hResult = m_pHtmlDoc->QueryInterface(IID_IPersistStreamInit, (void**)&spPSI);
if( SUCCEEDED(m_hResult) && spPSI )
{
m_hResult = spPSI->IsDirty();
spPSI->Release();
}
}
return m_hResult;
}
HRESULT CHtmlEditCtrl2::GetDocumentTitle(CString& a_sTitle)
{
if(PrepareInterfaces() == FALSE)
{
return E_FAIL;
}
BSTR bstrTitle;
m_hResult = m_pHtmlDoc->get_title(&bstrTitle);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -