MFC中CHtmlEditCtrl类与CHtmlView类的使用

 工作中需要用到标题中的两个类,有很多不明白之处,在网上查找了些资料,整理后写了两个函数:

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

你可能感兴趣的:(MFC中CHtmlEditCtrl类与CHtmlView类的使用)