工作中需要用到标题中的两个类,有很多不明白之处,在网上查找了些资料,整理后写了两个函数:
1、CHtmlView类加载内存中的HTML文本函数(CMyHtmlCtrl是从CHtmlView类继承的),此函数主要是参照了http://www.vckbase.com/document/viewdoc/?id=1472
//*******************************************************************
// 函数名: NavigateHTML()
// 显示指定的HTML文本内容。
//
// 参数列表:
// {I] const CString& szHtml:要显示的HTML文本内容
//
// 返回值:
// 无
//*******************************************************************
void CMyHtmlCtrl::NavigateHTML(const CString& szHtml)
{
// 显示空白页
Navigate2(_T("about:blank"), NULL, NULL);
// 取得控件的htmldocument对象
IDispatch* pDocument = GetHtmlDocument();
if (NULL == pDocument)
{
// 取htmldocument对象失败
return;
}
// 取得文档中的IPersistStreamInit对象
CComPtr<IPersistStreamInit> pPersistStreamInit;
HRESULT hr = Document->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit);
if (FAILED(hr))
{
return;
}
// 分配内存
LPTSTR lpMem = (LPTSTR)::GlobalAlloc(GPTR, (szHtml.GetLength() + 1) * sizeof(TCHAR));
if (NULL == lpMem)
{
// 内存分配失败
return;
}
::lstrcpy(lpMem, (LPCTSTR)szHtml);
// 创建流对象
CComPtr<IStream> pStream;
hr = ::CreateStreamOnHGlobal(lpMem, TRUE, &pStream);
if (FAILED(hr))
{
// 流对象创建失败
return;
}
hr = pPersistStreamInit->InitNew();
if (!SUCCEEDED(hr))
{
return;
}
hr = pPersistStreamInit->Load(pStream);
if (!SUCCEEDED(hr))
{
return;
}
}
2、取得HTML文档中控件值的方法(下面的代码只有TEXTAREA经过测试,其它的也是参照网上的文章改写的,并未经过测试)
enum EM_ELEMENT_TYPE{EM_ELETYPE_TEXTAREA, // 多行文本框
EM_ELETYPE_TEXT, // 单行文本框
EM_ELETYPE_PASSWORD, // 密码框
EM_ELETYPE_RADIO, // 单选按钮
EM_ELETYPE_CHECKBOX, // 复选框
EM_ELETYPE_END};
//*******************************************************************
// 函数名: GetValue()
// 取得HTML文档中指定名称的控件中的值。如文本输入框中的内容或
// RADIO、CHECKBOX的选择状态等。
//
// 参数列表:
// [I] EM_ELEMENT_TYPE emType:控件类型
// [I] const CString& szName:控件的名称
// [O] CString& szValue:控件的值
//
// 返回值:
// 无
//*******************************************************************
void CMTSHtmlCtrl::GetValue(EM_ELEMENT_TYPE emType, const CString& szName, CString& szValue)
{
// 此函数中的指针大部分都定义为智能指针,不用显式释放。
// 取得控件的htmldocument对象
IDispatch* pDispatch = GetHtmlDocument();
if (NULL == pDispatch)
{
// 取htmldocument对象失败
return;
}
CComPtr<IHTMLDocument2> pDocument;
HRESULT hr = pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
if (FAILED(hr))
{
return;
}
CComPtr<IHTMLElementCollection> pElementCollection;
hr = pDocument->get_all(&pElementCollection);
if (FAILED(hr))
{
return;
}
long lNum;
hr = pElementCollection->get_length(&lNum);
if (FAILED(hr))
{
return;
}
CComVariant vIdx(0);
CComVariant vName((LPCTSTR)szName);
CComPtr<IDispatch> pTmpDispatch;
// 按名称查找
hr = pElementCollection->item(vName, vIdx, &pTmpDispatch);
if (FAILED(hr))
{
return;
}
switch (emType)
{
case EM_ELETYPE_TEXTAREA: // 多行文本框
{
CComPtr<IHTMLTextAreaElement> pTextArea;
hr = pTmpDispatch->QueryInterface(IID_IHTMLTextAreaElement, (void**)&pTextArea);
if (FAILED(hr))
{
return;
}
// 取得文本框内的内容
CComBSTR bstrValue;
hr = pTextArea->get_value(&bstrValue);
if (SUCCEEDED(hr))
{
szValue = bstrValue;
}
break;
}
case EM_ELETYPE_TEXT:
case EM_ELETYPE_PASSWORD:
{
CComPtr<IHTMLInputTextElement> pInput;
hr = pTmpDispatch->QueryInterface(IID_IHTMLInputTextElement, (void**)&pInput);
if (FAILED(hr))
{
return;
}
// 取得文本框内的内容
CComBSTR bstrValue;
hr = pInput->get_value(&bstrValue);
if (SUCCEEDED(hr))
{
szValue = bstrValue;
}
break;
}
case EM_ELETYPE_RADIO:
{
CComPtr<IHTMLInputButtonElement> pRadio;
hr = pTmpDispatch->QueryInterface(IID_IHTMLInputButtonElement, (void**)&pRadio);
if (FAILED(hr))
{
return;
}
// 取得文本框内的内容
CComBSTR bstrValue;
hr = pRadio->get_value(&bstrValue);
if (SUCCEEDED(hr))
{
szValue = bstrValue;
}
break;
}
case EM_ELETYPE_CHECKBOX:
{
CComPtr<IHTMLElement> pCheckBox;
hr = pTmpDispatch->QueryInterface(IID_IHTMLElement, (void**)&pCheckBox);
if (FAILED(hr))
{
return;
}
// 取得文本框内的内容
CComBSTR bstrValue;
hr = pCheckBox->get_innerText(&bstrValue);
if (SUCCEEDED(hr))
{
szValue = bstrValue;
}
break;
}
case EM_ELETYPE_END:
default:
szValue = _T("");
break;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mylgq/archive/2009/03/05/3958607.aspx