MF C: Использование CHtmlView со строкой памяти через about: или data :? - PullRequest
2 голосов
/ 12 февраля 2020

Я пытаюсь CHtmlView отобразить html из переменных памяти. Разобравшись с различными исключениями, которые вы получаете в режиме отладки, настройте его на очень маленькие строки через about: uri.

Пример:

Navigate(_T("about:<html><head></head><body>Hello</body></html>"))

работает для небольших предметов, но не для больших строк. Кто-нибудь знает документированное ограничение для about:?

Теперь я нашел новый элемент, который должен быть доступен для IE, запись data:, но когда я пытаюсь

Navigate(_T("data:text/html, <html><head></head><body>Hello</body></html>"))

Не работает, придумывает причудливую веб-страницу, не может быть отображена страница. Кто-нибудь знает, почему CHtmlView не поддерживает data: и есть ли какой-либо другой прием, который можно использовать для использования данных переменной памяти для отображения html в CHtmlView?

1 Ответ

3 голосов
/ 12 февраля 2020

Один из вариантов установки содержимого HTML напрямую - чтение из памяти с помощью IStream

MF C CHtmlEditCtrl использует аналогичный метод для установки содержимого документа html, за исключением MF C использует CStreamOnCString.

. Возможно, для совместимости вам может потребоваться установить содержимое в UTF8. Чтобы использовать UTF8, измените CString на CStringA в приведенном ниже коде и передайте строку UTF8 в функцию SetHTMLContent(htmlview, u8"<html>...")

HRESULT SetHTMLContent(CHtmlView* htmlview, CString html)
{
    if(!html.GetLength()) return E_FAIL;

    CComPtr<IDispatch> disp = htmlview->GetHtmlDocument();
    if(!disp)
    {
        //not initialized, try again
        htmlview->Navigate(_T("about:"));
        disp = htmlview->GetHtmlDocument();
        if(!disp)
            return E_NOINTERFACE;
    }

    CComQIPtr<IHTMLDocument2> doc2 = disp;
    if(!doc2) return E_NOINTERFACE;

    int charsize = sizeof(html.GetAt(0));
    IStream *istream = SHCreateMemStream(
        reinterpret_cast<const BYTE*>(html.GetBuffer()), charsize * html.GetLength());
    HRESULT hr = E_FAIL;
    if(istream)
    {
        CComQIPtr<IPersistStreamInit> psi = doc2;
        if(psi)
            hr = psi->Load(istream);
        istream->Release();
    }
    html.ReleaseBuffer();

    return hr;
}

Использование:

CString str = _T("<html><head></head><body>Hello</body></html>");
SetHTMLContent(m_chtmlview, str);
...